1. 滑动窗口是什么?

就是有一个大小可变(不定长)或不可变(定长)的窗口,左右两端方向一致的向前滑动。

可以想象成一个队列,一端在push元素,另一端在pop元素,然后在每轮push和pop中完成更新或其他判别操作。

2. 滑动窗口可以解决什么问题?

适用范围:

  • 1、一般是字符串或者列表

  • 2、一般是要求最值(最大长度,最短长度等等)或者子序列

3. 基本实现思路

3.1 定长滑动窗口求可行解个数

求解思路

此类问题,假设固定窗口宽度为k,数据集大小为numsSize;

只需定义左指针left即可,窗口可以被描述为[left, left + k - 1],left的遍历范围为[0, numsSize - k - 1];

在遍历过程中,指针不断向后移动,更新窗口内元素的某项指标,判断该指标是否满足条件,确定该窗口是否是可行解;

在指针向后移动的过程中,注意更新因窗口左边界离开窗口和新元素进入窗口而引起窗口内某项指标的变化;

3.2 定长滑动窗口相关刷题

(1)1456. 定长子串中元音的最大数目

我的题解文章地址:leetcode-1456. 定长子串中元音的最大数目

(2)2269. 找到一个数字的 K 美丽值

我的题解文章地址:leetcode-2269. 找到一个数字的 K 美丽值

(3)1984. 学生分数的最小差值

我的题解文章地址:leetcode-1984. 学生分数的最小差值

(4)643. 子数组最大平均数 I

我的题解文章地址:leetcode-643. 子数组最大平均数 I

(5)1343. 大小为 K 且平均值大于等于阈值的子数组数目

我的题解文章地址:leetcode-1343. 大小为 K 且平均值大于等于阈值的子数组数目

其他

2090. 半径为 k 的子数组平均值

2379. 得到 K 个黑块的最少涂色次数

1052. 爱生气的书店老板

2841. 几乎唯一子数组的最大和

2461. 长度为 K 子数组中的最大和

1423. 可获得的最大点数

2134. 最少交换次数来组合所有的 1 II

2653. 滑动子数组的美丽值

567. 字符串的排列

438. 找到字符串中所有字母异位词

2156. 查找给定哈希值的子串

2953. 统计完全子字符串

3.2 不定长滑动窗口相关刷题

3.2.1 求最长/最大

(1)3. 无重复字符的最长子串

我的题解文章地址:leetcode-3. 无重复字符的最长子串

其他

1493. 删掉一个元素以后全为 1 的最长子数组 1423

2730. 找到最长的半重复子字符串 1502

904. 水果成篮 1516

1695. 删除子数组的最大得分 1529

2958. 最多 K 个重复元素的最长子数组 1535

2024. 考试的最大困扰度 1643

1004. 最大连续1的个数 III 1656

1438. 绝对差不超过限制的最长连续子数组 1672

2401. 最长优雅子数组 1750

1658. 将 x 减到 0 的最小操作数 1817

1838. 最高频元素的频数 1876

2516. 每种字符至少取 K 个 1948

2831. 找出最长等值子数组 1976

2106. 摘水果 2062

1610. 可见点的最大数目 2147

2781. 最长合法子字符串的长度 2204

2968. 执行操作使频率分数最大 2444

395. 至少有 K 个重复字符的最长子串

1763. 最长的美好子字符串

3.2.2 求最短/最小

209. 长度最小的子数组

1234. 替换子串得到平衡字符串 1878

1574. 删除最短的子数组使剩余数组有序 1932

76. 最小覆盖子串

面试题 17.18. 最短超串

3.2.3 不定长滑动窗口(求子数组个数)

2799. 统计完全子数组的数目 1398

713. 乘积小于 K 的子数组

1358. 包含所有三种字符的子字符串数目 1646

2962. 统计最大元素出现至少 K 次的子数组 1701

2302. 统计得分小于 K 的子数组数目 1808

2537. 统计好子数组的数目 1892

2762. 不间断子数组 1940

2972. 统计移除递增子数组的数目 II 2153

3.2.4 多指针滑动窗口

930. 和相同的二元子数组 1592

1248. 统计「优美子数组」 1624

2563. 统计公平数对的数目 1721

1712. 将数组分成三个子数组的方案数 2079

2444. 统计定界子数组的数目 2093

992. K 个不同整数的子数组 2210