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