1.题目
2.算法分析
这种题目,首先想到的是暴力穷举法:
用两层循环取遍该数组的所有子数组,然后找到那个最短的就可以了。
我们的滑动窗口就是对这种暴力穷举法进行优化:
主要是舍弃的思想,舍弃那些一定不可能是最终答案的结果:
如果该数组的某个子数组已经符合题意了,那么包含这个子数组的所有数组都不可能是最短的数组,统统舍掉!
举个例子:
ret[]={5,2,3,4,6};target=7;
子数组{5,2}是符合题意的,那么包含该子数组的数组例如{5,2,3},{5,2,3,4}等等不可能是最短的。
这时我们就需要从5的下一个位置开始考虑。
2.1什么是滑动窗口
那么我们来介绍一下什么是滑动窗口:
滑动窗口其实就是同向的双指针算法,利用题目的单调性来进行优化暴力穷举法。
由于同向的两个指针遍历数组的动作很像窗口两端的滑动,所以称这种算法为滑动窗口。
如何使用滑动窗口呢?
进窗口->判断->出窗口->更新结果。(更新结果的位置不固定)。
时间复杂度:
大概遍历两次数组,所以时间复杂度为O(n)。
3.提交结果与代码实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size(),len=INT_MAX,sum=0;
for(int left=-1,right=0;right<n;right++){
sum+=nums[right];//进窗口
while(sum>=target){//判断
len=min(len,right-left);//更新结果
sum-=nums[++left];//出窗口
}
}
return len==INT_MAX?0:len;
}
};