2972.力扣每日一题7/11 Java(击败100%)

news2024/9/28 9:33:28
  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

 

 

目录

解题思路

解题方法

时间复杂度

空间复杂度

Code 


解题思路

该问题的目标是计算给定数组中,可以移除的递增子数组的数量。一个子数组如果可以移除,意味着它在原数组中是递增的。为了解决这个问题,我采用了以下策略:

  1. 寻找最长递增前缀:首先,我寻找数组中从第一个元素开始的最长递增子序列(前缀)。这是因为任何包含这个前缀的子数组都是递增的,因此可以移除。

  2. 处理特殊情况:如果整个数组(除了最后一个元素外)都是递增的,那么任何非空子数组都可以移除。在这种情况下,直接返回所有可能的子数组数量,即 n*(n+1)/2

  3. 枚举递增后缀:如果数组不是整体递增的,那么我从数组的末尾开始,尝试找到可以与前面找到的最长递增前缀相结合的递增后缀。对于每个这样的后缀,我计算可以与它结合的最长递增前缀的长度。

  4. 累加可移除子数组数量:对于每个找到的递增后缀,我将其与兼容的前缀组合,形成可以移除的递增子数组,并累加这些组合的数量。

解题方法

  1. 使用findLongestIncreasingPrefix方法找到最长递增前缀

  2. 检查是否整个数组(除最后一个元素外)都是递增的。如果是,直接返回所有可能的子数组数量

  3. 如果不是整体递增,使用循环从数组末尾开始查找递增后缀

  4. 对于每个递增后缀,使用findCompatiblePrefixLength方法找到可以与它结合的最长递增前缀

  5. 累加可以与当前后缀组成递增子数组的前缀数量

  6. 返回累加的数量作为结果

时间复杂度

  • findLongestIncreasingPrefix方法遍历数组一次,时间复杂度为O(n)
  • 主循环从数组末尾开始,最多遍历数组一次,对于每个位置,findCompatiblePrefixLength可能再次遍历数组,因此总的时间复杂度为O(n^2)

空间复杂度

该算法只使用了几个变量来存储中间结果,没有使用额外的数据结构来存储大量数据,因此空间复杂度为O(1)

Code

class Solution {  
    public long incremovableSubarrayCount(int[] a) {  
        int n = a.length;  
          
        // 找到最长递增前缀的长度  
        int prefixLength = findLongestIncreasingPrefix(a);  
          
        // 如果整个数组都是递增的,则任何非空子数组都可以移除  
        if (prefixLength == n - 1) {  
            // 返回所有可能的非空子数组的数量(使用等差数列求和公式)  
            return (long)n * (n + 1) / 2;  
        }  
          
        long count = prefixLength + 2; // 初始化计数为整个前缀和整个数组本身  
          
        // 枚举所有可能的递增后缀  
        for (int suffixStart = n - 1;   
             suffixStart >= 0 && a[suffixStart] < (suffixStart + 1 < n ? a[suffixStart + 1] : Integer.MAX_VALUE);   
             suffixStart--) {  
            // 找到能与当前后缀组成递增序列的最长前缀的长度  
            int compatiblePrefixLength = findCompatiblePrefixLength(a, prefixLength, suffixStart);  
            count += compatiblePrefixLength + 1; // 累加可以组成的递增子数组数量  
        }  
          
        return count;  
    }  
      
    // 辅助方法:找到最长递增前缀的长度  
    private int findLongestIncreasingPrefix(int[] a) {  
        int n = a.length;  
        int i = 0;  
        while (i < n - 1 && a[i] < a[i + 1]) {  
            i++;  
        }  
        return i;  
    }  
      
    // 辅助方法:找到与给定后缀兼容的最长前缀的长度  
    private int findCompatiblePrefixLength(int[] a, int initialPrefixLength, int suffixStart) {  
        int prefixLength = initialPrefixLength;  
        // 从之前找到的最长递增前缀开始向前查找,直到找到可以与后缀组成递增序列的前缀  
        while (prefixLength >= 0 && a[prefixLength] >= a[suffixStart]) {  
            prefixLength--;  
        }  
        return prefixLength + 1; // 返回兼容前缀的长度(包括prefixLength指向的元素)  
    }  
}

 

  A miss is as good as a mile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode编译环境配置-c++

1. 支持跳转 安装c/c扩展 安装后即可支持跳转

Elasticsearch:介绍 retrievers - 搜索一切事物

作者&#xff1a;来自 Elastic Jeff Vestal, Jack Conradson 在 8.14 中&#xff0c;Elastic 在 Elasticsearch 中引入了一项名为 “retrievers - 检索器” 的新搜索功能。继续阅读以了解它们的简单性和效率&#xff0c;以及它们如何增强你的搜索操作。 检索器是 Elasticsearc…

还不懂 OOM ?详解内存溢出与内存泄漏区别!

内存溢出与内存泄漏 1. 内存溢出&#xff08;Out Of Memory&#xff0c;OOM&#xff09; 概念&#xff1a; 内存溢出是指程序在运行过程中&#xff0c;尝试申请的内存超过了系统所能提供的最大内存限制&#xff0c;并且垃圾收集器也无法提供更多的内存&#xff0c;导致程序无…

深入浅出Ansiable

目录 Ansible的起源 Ansible的发展史 Ansible的功能 Ansible的特性 Ansible的架构 Ansible的注意事项 Ansible入门 Ansible的安装 Ansible配置文件 配置文件解析 inventory主机配置清单 Ansible相关工具 Ansible的常用模块 Command模块 shell模块 Script模块 C…

Windows 电脑查看 WiFi 密码的方法都有哪些?

从设置面板中查看 当你使用的是笔记本电脑并且连接 WiFi 之后可以在设置面板中查看 WiFi 密码&#xff0c;首先打开设置界面&#xff0c;然后点击网络和 Internet&#xff0c;找到 WiFi 之后点击进入&#xff0c;然后点击管理已知网络。 然后点击已经连接好的无线网络。 进入之…

快速导入mysql百万用户数据

1. 前言 随着互联网的发展,大数据已经是很普遍的一个现象,已不再是零几年时的神话。数据资源意为着就是信息资源,很好的使用起来说是财富资源一点也不夸张.所以无论当下是小的还是大的互联网公司都会遇到大数的情况。只不过不同的业务逻辑需求与使用情况不一样罢了。 大数据我…

git为文件添加可执行权限

查看文件权限 git ls-files --stage .\SecretFinder.py100644 表示文件的所有者有读取和写入权限 添加可执行权限 git update-index --chmod x .\SecretFinder.py再次查看文件权限 git ls-files --stage .\SecretFinder.py100755 表示文件的所有者有读取、写入和执行权限

安卓逆向经典案例——XX优品(uniapp)

uni-app逆向 uniapp的目录结构 有一个io文件夹&#xff0c;下面有dcloud uniapp UniApp 可以用于开发 H5 应用&#xff0c;但它不仅仅局限于 H5 应用。UniApp 的特点包括&#xff1a; 1. 跨平台&#xff1a;可以一套代码同时生成适用于多个平台&#xff08;如 iOS、Android、…

STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)

一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块&#xff0c;形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…

Linux C语言基础 day9

目录 思维导图 学习目标&#xff1a; 学习内容&#xff1a; 1. 值传递与地址传递&#xff08;非常重要&#xff09; 1.1 值传递 1.2 地址传递 2. 递归函数 2.1 递归的概念 2.2 递归条件 2.3 递归思想 3. 指针 3.1 指针相关概念 3.2 指针变量的定义 3.2.1. 定义格…

初识MVVM分层思想——05

1.MVVM是什么&#xff1f; M &#xff1a;model&#xff08;模型/数据&#xff09; V : view&#xff08;试图&#xff09; VM &#xff1a;ViewModel &#xff08;试图模型&#xff09; &#xff1a; VM 是MVVM 中的核心部分。&#xff08;它起到一个核心的非常重要的作用&…

mac下mysql无法登陆的问题

用如下命令登录出现错误。 sudo mysql.server start解决方案 使用如下命令登录 sudo /usr/local/MySQL/support-files/mysql.server start

【C++基础】初识C++(1)

目录 一、认识C 1.1 C 相关概念 1.2 C的发展 1.3 C的关键字 1.4 第一个程序 二、命名空间 2.1 namespace的定义 2.2 命名空间的使用 三、C输入和输出 四、缺省函数 五、函数重载 一、认识C 1.1 C 相关概念 1983年&#xff0c;Bjarne Stroustrup在C语⾔的基础上…

Python 视频的色彩转换

这篇教学会介绍使用OpenCV 的cvtcolor() 方法&#xff0c;将视频的色彩模型从RGB 转换为灰阶、HLS、HSV...等。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#x…

BMS电池管理系统 — 1 什么是BMS

目录 1 储能系统组成 1.1 储能电池结构 1.2 储能集装箱组成 2 BMS系统组成 3 BMS功能 3.1 SOC荷电状态估计 3.2 SOH估计 3.3 主动均衡与被动均衡 3.4 电池热管理 4 BMS架构 4.1 集中式BMS 4.2 分布式BMS 参考论文 1 储能系统组成 1.1 储能电池结构 电芯&#xf…

docker(六)--创建镜像

六、创建镜像 1.创建镜像两种方式 方式1&#xff1a; 更新镜像 docker commit 方式2&#xff1a;构建镜像 docker build 2.更新镜像 1&#xff09;用法 docker commit -m“描述信息” -a作者 容器id或者容器名 镜像名:tag 2&#xff09;步骤 ①根据镜像运行容器 ②进入容…

PHP将两张图片合成一张图片代码实例(源代码)

使用PHP将两张图片合成一张图片可以通过GD库来实现。下面是一个示例代码&#xff0c;展示如何将两张图片合成一张图片&#xff1a; 加载两张图片。获取每张图片的宽度和高度。创建一个新的空白图片&#xff0c;其宽度是两张图片宽度的和&#xff0c;高度是两张图片中较大的高度…

酒店民宿小程序:酒店民宿便利预订,提高收益!

在旅游业发展旺盛时期&#xff0c;酒店民宿也得到了快速发展。随着移动互联网的发展&#xff0c;人们逐渐在手机上预订酒店民宿&#xff0c;这给酒店民宿小程序的发展提供了用户基础&#xff0c;为大众出行带来了更多的便利。 酒店民宿小程序是一个基于微信平台的应用程序&…

PHP计件工资系统小程序源码

解锁高效管理新姿势&#xff01;全面了解计件工资系统 &#x1f525; 开篇&#xff1a;为什么计件工资系统成为企业新宠&#xff1f; 在这个效率至上的时代&#xff0c;企业如何精准激励员工&#xff0c;提升生产力成为了一大挑战。计件工资系统应运而生&#xff0c;它以其公…

Python大数据分析——K近邻模型(KNN)

Python大数据分析——K近邻模型 数学部分模型思想模型步骤距离度量指标欧氏距离曼哈顿距离余弦相似度 K值选择 代码部分函数示例1——知识掌握程度示例2——预测发电量 数学部分 模型思想 如图所示&#xff0c;模型的本质就是寻找k个最近样本&#xff0c;然后基于最近样本做“…