一、滑动窗口算法
其实就是个可以滑动的窗口,好吧,有点废话了,但是确实是这样的。设置两个指针控制窗口的开始与结束,窗口外的内容可以暂不考虑,这样就减少了一些无用的情况,所以会比暴力解法时间复杂度低。
二、滑动窗口思路
1、在操作字符串或者数组时,设置left与right双指针,初始值都为0,[ left, right ]就是一个窗口;
2、遍历并不断地让 right 指针右移,直到满足既定条件,刷新结果;
3、此时 right 不变,不断增加 left 指针,缩小窗口,只要满足既定条件,就刷新结果,直到不符合既定条件时,回到操作第2步。
三、下面是一道例题,出自LeetCode209
这道题用滑动窗口做旧非常合适了,代码如下:
/ * @param {number} target * @param {number[]} nums * @return {number} */ var minSubArrayLen = function(target, nums) { let left = 0, right = 0, minLen = Infinity, sum = 0; for (;right < nums.length; right++) { sum += nums[right]; while (sum >= target) { // 满足条件,更新结果 minLen = Math.min(minLen, right - left + 1); // left指针右移,不要忘了删掉窗口中移出的数据 sum -= nums[left++]; } } return minLen === Infinity ? 0 : minLen; };
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233233.html原文链接:https://javaforall.net