| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Leetcode刷题c++之862.和至少为K的最短子数组 -> 正文阅读 |
|
[数据结构与算法]Leetcode刷题c++之862.和至少为K的最短子数组 |
题目描述:
示例1: 输入:nums = [1], k = 1 输出:1 示例2: 输入:nums = [1,2], k = 4 输出:-1 示例3: 输入:nums = [2,-1,2], k = 3 输出:3 提示:
思路: 一开始我想到的方法就是暴力破解,直接用前缀和数组的方式来解决。 先求出前缀和数组prenums,要求出连续数组的和就是将前缀和数组中的后节点减去前节点,比如求i-j之内的连续数组和就是(prenums[j + 1] - prenums[i])。然后通过双指针遍历前缀和数组,求出符合条件的连续数组,然后记录最短的子连续数组的长度。 代码如下:
但是这样的代码直接丢到力扣上跑,会超出时间限制,因为这样的算法里进行了双重循环,时间复杂度达到了O(n2)。 ?所以我们必须对这个前缀和数组进行优化,将时间复杂度降下来。 优化一: 当我们遍历到prenums[j]时,考虑左边的某个prenums[i],如果prenums[j] - prenums[i] >= k,那么无论prenums[j]右边的数字是大是小,都不可能把j当作子数组的左端点,得到一个比j-i更短的子数组了。所以prenums[j]就没用了,可以把他去掉。 优化二: 如果prenums[j] <= prenums[i],假如后续有数字x能和prenums[i]组成满足要求的子数组,即x-prenums[i] >= k,又因为prenums[j]比prenums[i]更小,而且离x更近,所以不需要prenums[i]了,可以把他去掉。 做完这两个优化后,再把prenums[j]加到这个数据结构中。 由于优化二保证了数据结构中的 prenums[j]会形成一个递增的序列,因此优化一移除的是序列最左侧的若干元素,优化二移除的是序列最右侧的若干元素。我们需要一个数据结构,它支持移除最左端的元素和最右端的元素,以及在最右端添加元素,故选用双端队列。 代码如下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:39:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |