滑动窗口三步走:
第一步确定尾指针++的条件,往右扩张;第二步确定头指针++的条件,往右收缩,第三步更新所求目标值(一般都是极值)
滑动窗口伪代码:
start = 0
end = 0 //初始化
while(扩张条件)
{
while(收缩条件)
{
FindTarget()//收缩时一般求极小值
start++//收缩,有可能是++,也有可能是跳跃式移动
}
FindTarget()//扩张时一般求极大值
end++//扩张,一般都是++
}
if(一次都没进入过收缩条件)
{
特殊处理一下
}
目前来看,滑动窗口主要有两种题型,一种是找最长/最短子数组,这种使用上述的三步走策略。另一种是固定长度的窗口内的极值,此时需要借助单调队列
题目一:209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
思路:
for(遍历整个字符串)
{
for(和值大于target)
{
计算一次最短长度
头指针右移收缩
}
尾指针右移扩张
}
没收缩过需要特殊处理
代码:
int minSubArrayLen(int target, int* nums, int numsSize)
{
int start = 0, end = 0;
int sum = 0, minlen = I