概念理解
滑动窗口是两个指针向右移动遍历整个数组。而双指针的思想是左右两个指针,不停的向里面缩进。
最小滑动窗口是不满足条件right右移,满足条件left右移,直到不满足条件为止。
最大滑动窗口是满足条件right右移,不满足条件left右移,直到满足条件为止。(也可以不缩left,而是同时平移left与right,参考1438. 绝对差不超过限制的最长连续子数组)
最大滑动窗口和最小滑动窗口可以理解结尾,以当前right指向的元素为结尾的子数组,满足题目条件的情况下,最长(最短)可以是多少。
题型总结
最小滑动窗口
- AAAAA3. 无重复字符的最长子串
重点是确定左边界。利用map可以免去第二层循环遍历寻找相同的字符。 - AAAA424. 替换后的最长重复字符
在一段区间内有K几次会修改字符使得这个区间里的字符全部一致,尝试拓展这个区间范围直到不能通过K次修改使得区间字符一致。 - AAA1984. 学生分数的最小差值
要想选取得k个数得最大值与最小值得差最小,应该让所选得这7个数尽可能得靠近。解决办法是对数组排序,然后固定滑动窗口移动,求出最小的差。 - AAA567. 字符串的排列
滑动窗口固定长度遍历s2,若窗口内的字符个数与字符种类与s1的一致,则说明存在,否则不存在。 - AAAAA76. 最小覆盖子串
不断增加j使滑动窗口增大,直到窗口包含了T的所有元素.不断增加i使滑动窗口缩小,知道不满足条件。
最大滑动窗口
- AAAAA904. 水果成篮
最大滑动窗口是满足条件right右移,不满足条件left右移,直到满足条件为止。 - AAAAA1004. 最大连续1的个数 III
把「最多可以把 K 个 0 变成 1,求仅包含 1 的最长子数组的长度」转换为 「找出一个最长的子数组,该子数组内最多允许有 K 个 0 」 - AAAA1208. 尽可能使字符串相等
- AAAAA1438. 绝对差不超过限制的最长连续子数组
当窗口不满足条件时,没有必要一直缩left,只有出现比当前ans更长的满足条件的子数组才会更新ans。
固定长度滑动窗口
- AAA1052. 爱生气的书店老板
固定滑动窗口遍历数组,寻找固定长度minuts内,最多有多少多少生气的顾客。
逆向思维
- AAAA1423. 可获得的最大点数
逆向思维,不求最大,求剩余部分的最小区间。
技巧
旋转数组
旋转数组,容易想到将 nums进行复制拼接,得到长度为 2 * n的新数组,在新数组上任意一个长度为 n 的滑动窗口都对应了一个旋转数组。