前端算法思想--滑动窗口

187 阅读3分钟

1.什么是滑动窗口

滑动窗口是指通过“开头指针”和“结束指针”中间区域构成的窗口,所以滑动窗口的本质其实是“双指针”的思想。但是窗口的不是无限制的扩大或者缩小,窗口的元素必须满足题目中对于元素的限制条件,通常为以下两种:
1.一般为连续的元素,例如连续子数组
2.这个窗口中的元素可以或者可能可以提供题目中的解 滑动窗口的难点在于: 初始化的时候头指针和尾指针都是index=0 不断的增加尾指针(向窗口塞入元素),这是一个窗口形成的过程,最后窗口扩大到一个临界点。 此时有两个问题:
窗口什么时候扩大到临界点?
临界窗口意味着什么?
元素满足什么样的条件可以进入这个窗口,或者窗口内的元素单个或者所有元素满足什么条件
这个窗口应该怎么扩大,扩大的截止条件是什么?

2.滑动窗口相关题目

2.1 无重复字符的最长子串

image.png 序列:【a,b,c,d,c,e 】 滑动窗口,对于这一题,暴力解法就是列出所有的arr[index]为开头的所有序列集合,在每个arr[index]为开头的序列集合中找出最优解,然后对比每个arr[index]的最优解,得到题目的最优解。这是分而治之解法。 那么,如果根据这种暴力解法优化,对暴力解法优化无非就是“剪枝”,减少不必要的计算。 暴力法: start = 0, start = 1, start = 2, start = 3, start = 4 index = 0,窗口向右扩大的过程可以认为以index =0开头的子序列枚举的过程。

image.png

思考:滑动窗口为什么可以做到不重不漏!

窗口第一次停止意味着什么?
意味着两点:遇到index=4停止,窗口范围index=0,3
浅层含义:以index = 0开头的序列的最优解就是此时窗口中的序列
深层含义:是一部分以index=i开头的序列的最优解
究竟i是多少,i就是下一次窗口形成的index值,当index=3时候,窗口又形成。所以index = 0开头的序列的最优解也是index=1,2(b,c开头)序列集合的最优解。
下一次窗口开始意味着什么?
以index=3开头的序列中寻找最优解。
窗口结束意味着各个以index=i开头的最优解已经找齐,现在开始比较寻找题目解 所以,就将滑动窗口看成分而治之中,各个以index=i开头的序列集合对比,剪枝 + 部分最优解合并。 注意点:窗口总是从左向右移动 滑动窗口模版&& 题解

var lengthOfLongestSubstring = function(s) {
    var window = new Set();
    let start = 0;
    let end = 0;
    let result = 0;
    while (end < s.length) {
        while(window.has(s[end])) {
            window.delete(s[start]);
            start = start + 1;
        }
        window.add(s[end])
        end = end + 1;
        result = Math.max(window.size, result)
    }
    return result
};

2.2 字符串的排列

2.3 乘积小于K的子数组

2.4 数组中的最长山脉