题目
链接:leetcode链接
思路分析(滑动窗口)
1、为什么会想到使用滑动窗口呢?
首先,子数组是连续的,第二,所有的元素都是正整数,所以子数组的和具有单调性。
所以,对这个和的研究可以想到滑动窗口。
2、怎么使用滑动窗口?
使用滑动窗口一般有以下步骤。
进窗口,判断,出窗口,以及更新结果,更新结果的步骤根据不同的情景有不同的变化,前三个步骤一般都会有。
3、这个题怎么使用滑动窗口
首先,定义left和right指针,都从0位置开始。
随着left和right的移动,left和right之间就夹出了窗口。这也就是滑动窗口名字的由来(形象生动)
我们再设置一个sum变量,来统计窗口之间的和的大小。
在left和right的移动过程中,会出现一下两种情况:
1、sum < target。(判断)
说明和太小了,需要继续扩大窗口,于是right++,继续处理(进窗口)
2、sum >= target(判断)
和的大小达到了要求,这时候就需要去寻找最小的窗口。
可以通过++left来缩小窗口(出窗口),直到sum < target。
在每一次符合要求的窗口中寻找最小的窗口即可。(更新结果)
代码
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0,len = INT_MAX;
for(int left = 0,right = 0;right < nums.size();++right)
{
sum += nums[right];//进窗口
while(sum >= target)//判断
{
len = min(len,right - left + 1);//更新结果
sum -= nums[left];//出窗口
++left;
}
}
return len == INT_MAX?0:len;
}