滑动窗口算法笔记
力扣209
- 题目分析:
- 想象一个窗口遍历着这个数组,不断扩大右边界,让r++。往窗口中添加数字:
此时我们找到了这个窗口,它的和满足了大于等于target的条件,题目让我求最短的,那么我们就尝试来缩短它:
如果发现不满足条件则不能缩短,那么就记录下当前答案,拿去进行更新即可,那么此时答案为4。
接着走:
- 诶,此时发现又满足条件了,又能尝试缩短了。
此时长度为3, 与刚才的4比较发现比4还要短,那么答案更新为3.
如此进行下去,即可求出答案。
那么我们的代码要进行的操作就是:
1.让窗口滑动:
可以利用左右两个指针来进行,右指针增加为扩大窗口,左指针增加,往右移动相当于缩短窗口。
2.尝试缩短窗口:
就是找符合条件的最小窗口,那么让左边一直动,只要区间和大于等于target就可以了,写一个循环加上判断条件。
3.更新答案,初始化答案为一个很大的值,随后不断和每一次答案比大小,如有更小的答案则更新,没有则维持原来的答案。
class Solution {public int minSubArrayLen(int target, int[] nums) {int ans = 1_000_000_000;for (int l = 0, r = 0, sum = 0; r < nums.length; r++) { sum += nums[r];while (sum - nums[l] >= target) { sum -= nums[l++];}if (sum >= target) {ans = Math.min(ans, r - l + 1);}}return ans == 1e9 ? 0 : ans;}
}