滑动窗口也是比较热门的算法之一,并且滑动算法是双指针的变种,在很多场景下均有应用
题目链接
参考题解
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length;
int j = 0;
int sum = 0;
int res = len+1;
for (int i = 0; i < len; i++) {
sum += nums[i];
while (sum >= target) {
res = Math.min(res, i - j + 1);
sum -= nums[j];
j++;
}
}
if (res == len+1){
return 0;
}
return res;
}
}
滑动窗口思想
滑动窗口本质就是快慢指针,一个在前,一个在后,共同维护一个可变的区间,如下图红框所示就是一个窗口
随着指针的移动,快慢指针的区间会发生变动,但是总体上保持整体向前移动的趋势
因此滑动窗口可以解决最大子串和最小子串等相关问题
以上题为例,初始化两个指针,一个快指针一个慢指针,都指向数组的第一个元素
随着快指针移动,快慢指针之间就有一个区间,计算此区间的和,是否大于等于目标值target
如果不大于的话,则一直移动快指针,即一直扩大区间的长度
当区间内和大于等于target时,记录区间长度后则可以尝试缩小区间长度,判断缩小后的区间和是否满足条件
如果缩小区间后不满足条件,则继续移动快指针以扩大区间大小
否则,则移动慢指针缩小区间大小,每次满足条件后都需要计算区间的长度,并与上次满足条件的区间长度比较,得到最小的区间长度
如此往复,最终得到最小区间长度
参考资料
熟能生巧,这种题型多练练,理解其中思想,必要时用笔在纸上画画图,更有益于理解