滑动窗口算法题型总结

滑动窗口算法题型总结

定长滑动窗口

  • [4-1456 定长子串中元音个数](LeetCode 1456 定长子串中元音个数.md)
  • [5-2461 长度为 k 子数组最大和](LeetCode 2461 长度为 K 子数组最大和.md)
  • [1-3 无重复字符的最长子串](LeetCode 3 无重复字符的最长子串.md)
  • [6-2653 滑动子数组的美丽值](LeetCode 2653 滑动子数组的美丽值.md)
  • [13-2134 最少交换次数来组合所有的 1](LeetCode 2134 最少交换次数来组合所有的 1.md)
  • [20-1052 爱生气的书店老板](LeetCode 1052 爱生气的书店老板.md)

不定长窗口:求最小

  • [2-209 长度最小的子数组](LeetCode 209 长度最小的子数组.md)
  • [11-1234 替换子串得到平衡字符串](LeetCode 1234 替换子串得到平衡字符串.md)
  • [12-1574 删除最短子数组使剩余数组有序](LeetCode 1574 删除最短子数组使剩余数组有序.md)

不定长窗口:求最大

  • 8-1658 将 X 减到 0 的最小操作数
  • [9-1838 最高频元素的频数](LeetCode 1838 最高频元素的频数.md)
  • [14-1004 最大连续 1 的个数](LeetCode 1004 最大连续 1 的个数.md)
  • [15-2024 考试的最大困扰度](LeetCode 2024 考试的最大困扰度.md)
  • [18-424 替换后的最长重复字符](LeetCode 424 替换后的最长重复字符.md)
  • [23-1297 子串的最大出现次数](LeetCode 1297 子串的最大出现次数.md)

不定长窗口:求子数组个数

  • [3-713 乘积小于 k 的子数组](LeetCode 713 乘积小于 K 的子数组.md)
  • [7-2401 最长优雅子数组](LeetCode 2401 最长优雅子数组.md)
  • [16-2962 统计最大元素出现至少 k 次的子数组](LeetCode 2962 统计最大元素出现至少 K 次的子数组.md)

重点题

  • [11-1234 替换子串得到平衡字符串](LeetCode 1234 替换子串得到平衡字符串.md)
  • [13-2134 最少交换次数来组合所有的 1](LeetCode 2134 最少交换次数来组合所有的 1.md)
  • [16-2962 统计最大元素出现至少 k 次的子数组](LeetCode 2962 统计最大元素出现至少 K 次的子数组.md)
  • [17-395 至少有 K 个重复字符的最长子串](LeetCode 395 至少有 K 个重复字符的最长子串 - 滑动窗口解法.md)
  • [21-1156 单字符重复子串的最大长度](LeetCode 1156 单字符重复子串的最大长度.md)
  • [23-1297 子串的最大出现次数](LeetCode 1297 子串的最大出现次数.md)
  • [28-1888 使二进制字符串交替的最少反转次数](LeetCode 1888 使二进制字符串交替的最少反转次数.md)

思路

核心套路是:先分类,再加“最优”约束,最后分析相邻窗口之间如何低成本更新。 这样做的本质是避免重复计算,后一个窗口通常只在前一个窗口基础上做有限修改。

  • 如果操作发生在数组两端,通常可以转化为“保留中间连续子数组”。
  • [2-209 长度最小的子数组](LeetCode 209 长度最小的子数组.md) 的窗口和既可以维护“大于等于 target”,也可以维护“小于 target”,两种写法都可行,区别在于答案更新时机。
  • [13-2134 最少交换次数来组合所有的 1](LeetCode 2134 最少交换次数来组合所有的 1.md) 的关键在于先确定答案窗口长度,再统计窗口内需要调整的元素。

滑动窗口通用检查表

  1. 先假设窗口内就是候选答案。
  2. 明确限制条件:
  • 长度限制。
  • 窗口内元素约束(和、计数、种类数)。
  1. 优先从“失败条件”倒推滑动规则,必要时用极端样例验证。
  2. 结合分类思想:按左端点分类或按右端点分类。

补充:[16-2962 统计最大元素出现至少 k 次的子数组](LeetCode 2962 统计最大元素出现至少 K 次的子数组.md) 是“计数型”窗口,和“最值型”窗口在答案更新位置上有所不同。

杂项

  • 长子串的出现次数不会超过其短前缀子串的出现次数,可用于剪枝:[23-1297 子串的最大出现次数](LeetCode 1297 子串的最大出现次数.md)。