滑动窗口也是一个典型的找特定条件的一个数组的最小数组。既然要滑动,那必须要有开始和结尾。那么初始的值可以定为i=0,而开始滑动之后的窗口的起始值就显得很重要,这个是窗口滑动的精髓,而结尾则可以用判断特定条件的打破作为结束点。讲了这么久,窗口是什么?窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
以letcode209,最小的子数组为例
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
方法如下
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sublen=0;
int count=999;
int len=nums.size();
int sum=0;
int i=0;
for(int j=0;j<len;j++){
sum+=nums[j];
while(sum>=target){
sublen=j-i+1;
if(sublen<count) count =sublen;
sum=sum-nums[i++];
}
}
if (count == 999) return 0;
else return count;
}
};
尤其要注意判断子数组的长度, sublen=j-i+1; 长度要+1.因为数组下标比实际少一位,这一点要注意一下。