滑动窗口
滑动窗口的本质还是双指针的应用
一 . 滑动窗口的作用
滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。
二 . 滑动窗口的用法
定义左右指针,右指针依次遍历数组,此时的下标即右指针,向后依次挪动 ; 当左指针和右指针区间内的元素不符合条件时,我们便会移动左指针,直至条件符合,继续挪动右指针。其间统计每一次的结果。
简单点说,就是 右指针 右移增大窗口,寻找符合的条件,当找到符合的条件时,记录下当前结果;然后 左指针右移,若还是符合条件,则记录下结果,左指针继续右移,若破除了符合条件,则继续右指针寻找下一个符合条件,如此来遍历每一个子元素是否符合条件。
三. 应用举例
eg-1. 长度最小的子数组 (leecode 209题, 难度 中等 )
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int right = 0;
int n = nums.length;
if(n == 0){
return 0;
}
int min = n + 10;
int sum = 0;
while(right < n){
sum += nums[right];
while(sum >= target){
min = Math.min(min, right - left + 1);
sum -= nums[left];
left++;
}
right++;
}
return min == n+10 ? 0 : min;
}
本人目前能力有限,更详细的解释可以看下下方链接(我就是看了他的图解才渐渐明白的):
滑动窗口算法思想图解说明