滑动窗口也能理解为一种双指针法
而滑动窗口是不断调节子序列的起始和终止位置来获得我们想要的结果
例题:209. 长度最小的子数组 - 力扣(LeetCode)
在该题中需要我们找出满足条件的子数组,可以用暴力解法双层循环遍历数组求得数组的所有子数组并获得长度最小符合条件的子数组,其时间复杂度为O(n^2)。
滑动窗口法可以将时间复杂度降为O(n),代码如下
int minSubArrayLen(int target, int* nums, int numsSize) {
int top=0,low=0;
int sum=0,minsize=INT_MAX,size=0;
for(top=0;top<numsSize;top++)
{
sum+=nums[top];
while(sum>=target)
{
size=top-low+1;
minsize=minsize<size?minsize:size;
sum-=nums[low++];
}
}
return minsize == INT_MAX ? 0 : minsize;
}
top指针与low指针都初始化指向数组首位,top为子数组右边界,low为子数组左边界,右边界向右扩张,当子数组数值之和(sum)大于等于给定的target值时,记录当前子数组长度,向右收缩左边界(数组数值之和减去low指针所指数,low指针向右移动)直到sum小于targat时继续扩张右边界直到完成遍历整个数组