题目
①滑动窗口介绍(双指针实现)在这里插入图片描述
本质:使用双指针表示数组区间。
数组的区间表示法,而区间变化过程 -> 很像滑动窗口
例如[left,right]表示:nums数组从索引left到right的元素
注意细节:
本题求的是连续子序列,才可以考虑这种做法。
因为窗口是连续的,是一个区间。如果不连续,滑动窗口就不能做了。
②滑动窗口思路解决本题
核心思路:
Ⅰ.窗口总和大于目标值的时候,窗口缩小。(left指针右移)
Ⅱ.窗口总和小于目标值的时候,窗口扩大。(right指针右移,如果越界就结束)
Ⅲ.等于的时候,更新最小值(使用cnt记录下最小值),并缩小窗口让循环继续进行(left指针右移)
注意:为什么等于,缩小窗口?
提示:缩小窗口的目的 -> 让整个窗口向右滑动。
③代码实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int slow = 0;
int fast = 0;
int sum = nums[slow];
int cnt = INT_MAX;
while(slow<nums.size()){
if(sum<target){
//不可直接sum+=nums[++fast]//因为有fast数组越界的风险
fast++;
if(fast>=nums.size())return (cnt==INT_MAX)?0:cnt;
sum+=nums[fast];
}
else{
cnt=min(cnt,fast-slow+1);
sum-=nums[slow];
slow++;
}
}
return (cnt==INT_MAX)?0:cnt;
}
};