滑动窗口介绍
滑动窗口主要利用数组相加的单调这个原理,通常在解决最小子区间之类的问题,比如最长,最短的数组,字串的时候会用到这个算法
算法的操作步骤主要分为如下的几步
1.入窗口
2.判断条件是否还满足
3条件不满足.更新结果,出窗口,条件还是满足的话继续进窗口
例题一
题目链接:长度最小的字数组
题目描述:
分析:在上面的题目当中,提及到了求长度最短的子数组,那这个题多半是要用滑动窗口来解决这个问题,下面我们来分析一下这个问题
1.定义两个指针,left,right,right和left共同维护着窗口的左边和右边
2.right不断加1,将right遍历的值加上去,由于一直是累加的,所以值必然是不断增加的
3.当累加的值大于目标值的话,这个时候需要统计一下值,然后再left++,累加的值减去left加之前的值这个时候累加的值必然是要减小的,知道累加的值小于target的时候left停止加加
代码:
cpp
int minSubArrayLen(int target, vector<int>& nums) {
int left=0,right=0;
int sum=0;
int ret=INT_MAX;
for(int right=0;right<nums.size();right++)
{
sum+=nums[right]; //right++:进窗口
while(sum>=target)
{
ret=min(ret,right-left+1); //不断统计值
sum-=nums[left++]; //left++:出窗口
}
}
if(ret==INT_MAX) //如果一直是这个值的话说明整个数组的值加起来都不及target
{ //说明找不到这个子数组,返回0
return 0;
}
else
{
return ret;
}
}
