难度参考
难度:简单
分类:数组
难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。
题目
给定一个含有个正整数的数组和一个正整数s,找出该数组中满足其和≥s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。
示例1:
输入:s=7,
nums=[2,3,1,2,4,3]
输出:2
解释:子数组[4,3]是该条件下的长度最小的子数组。
思路
暴力做法
使用暴力法解决这道题的思路是遍历所有可能的连续子数组,计算它们的和,并找到满足条件的最小子数组长度。以下是暴力法的详细题解:
-
初始化一些变量,包括最小长度
minLength
初始为正无穷大。 -
使用两层循环,外层循环以每个元素为起点,内层循环遍历从该起点开始的子数组。外层循环变量
start
从0开始,内层循环变量end
从start
开始。 -
在内层循环中,计算子数组的和
sum
,即从nums[start]
到nums[end]
的元素的累加和。 -
如果
sum
大于或等于目标值s
,说明当前子数组的和满足条件,可以记录下当前子数组的长度end - start + 1
。 -
在外层循环中,不断更新
minLength
,即记录当前满足条件的子数组的最小长度。 -
继续外层循环,直到遍历完整个数组。
-
最后,如果
minLength
没有被更新过,说明没有满足条件的子数组,返回0;否则,返回minLength
。
这个算法的核心思想是遍历所有可能的子数组,计算它们的和并比较长度,找到最小长度的满足条件的子数组。由于使用了两层循环,时间复杂度是O(n^2),其中n是数组的长度。这个算法虽然不如滑动窗口法高效,但是可以解决问题。
暴力做法不再提供示例与梳理,感觉可以直接看代码。
滑动窗口
可以使用滑动窗口的方法解决这个问题。滑动窗口是维护一个连续子数组的常用技巧,通过左指针和右指针来移动窗口,根据窗口内元素的和来调整窗口的大小。具体步骤如下:
-
初始化左指针
left
为0,右指针right
为0,以及窗口内元素的和sum
为0。 -
使用右指针
right
向右遍历数组,不断将元素添加到窗口内,并更新sum
。 -
当
sum
大于等于给定的正整数s
时,记录当前窗口的长度right - l