算法概念速查
什么是滑动窗口算法?何时用、怎么收缩、和双指针的区别
更新:2026-07-03吴师兄图解算法
一句话定义
滑动窗口用左右两个指针围出一段连续区间:右指针不断把新元素纳入窗口,一旦窗口「不合法」(出现重复、和超标……),左指针就向右收缩直到恢复合法。两个指针都只前进、不回退,每个元素最多进窗口一次、出窗口一次,把暴力枚举所有区间的 O(n²) 压到 O(n)。
先打个比方
像拉一扇可伸缩的窗帘扫过字符串:右边一格格拉开,把新字符纳进来;一旦窗内出现重复,就从左边往里收,直到重复消失,然后继续往右拉。窗帘一遍扫完,答案就在拉伸过程中被记录下来。
它是怎么运作的
写滑动窗口只需要回答三个问题:① 窗口的「合法」怎么定义(无重复字符?和 ≥ target?);② 右指针每纳入一个元素,窗口状态怎么更新(计数器加一、和累加);③ 何时收缩左指针、收缩时状态怎么退(计数器减一、和扣减)。三个问题想清楚,代码就是模板。
它能 O(n) 的前提是合法性单调:窗口越扩越「不合法」、越收越「合法」。一旦这个单调性不成立——比如数组含负数时「和为 K」的窗口和不再单调——滑动窗口就失效了,要换前缀和 + 哈希表。
什么时候用:识别信号
题目里出现下面任何一条,就该想到「滑动窗口」。
- 题目带「连续子数组 / 子串」+「最长 / 最短 / 恰好 / 至多」这类字眼
- 窗口合法性单调:扩张只会更糟、收缩只会更好(无重复、和不超、种类不超)
- 定长统计:长度为 k 的窗口逐格滑动,每步一进一出
- 暴力解是「枚举所有区间再逐个检查」的 O(n²) 或 O(n³)
别和它们搞混
配套动画题:眼见为实
每道题都有逐步交互动画,看着数据动起来,比读十遍文字都快。
常见追问
左指针为什么不能回退?
回退等于重新检查已经看过的区间,复杂度立刻退化成 O(n²)。滑窗的正确性依赖「以每个右端点结尾的最优左端点单调右移」,回退说明窗口定义或收缩条件写错了。
什么时候滑动窗口用不了?
合法性不单调时。最典型的是含负数的「和为 K 的子数组」:再扩窗口和可能变小,收缩也可能变大,滑窗判断失灵,此时用前缀和 + 哈希表一遍解决。
窗口内的状态用什么维护?
看合法条件要什么:判重复用哈希表或计数数组,判和用一个累加变量,判「覆盖」用两张计数表 + 一个满足数。原则是收缩时状态必须能 O(1) 撤销。