滑动窗口:什么时候区间问题可以不用重算
滑动窗口和双指针经常一起出现,但它解决的问题更具体:
滑动窗口和双指针经常一起出现,但它解决的问题更具体:
当你在处理连续区间时,能不能把“每次重算”改成“增量维护”。
为什么滑动窗口很重要
很多区间问题最直接的做法都是:
- 枚举区间左端点
- 枚举区间右端点
- 重新计算当前区间状态
这类做法通常复杂度很高,而且重复计算非常多。
滑动窗口的核心价值,就是把这些重复计算压掉。
什么时候该想到滑动窗口
我会先看这些信号:
- 问题对象是连续子数组或连续子串
- 暴力做法要反复计算区间信息
- 区间在移动时,可以把新进入和移出的元素单独处理
- 条件是“满足某种约束的最长/最短区间”
这类信号一出现,就很适合先试窗口。
滑动窗口的关键不是“滑”,而是“维护”
窗口真正难的点不在左右指针移动,而在于:
- 当前维护的是什么状态
- 当右端加入一个元素时怎么更新
- 当左端移出一个元素时怎么回退
如果这个状态定义不清楚,窗口就会写得很乱。
常见用途
- 最长不重复子串
- 最小覆盖子串
- 满足和/频次条件的最短区间
- 固定长度区间统计
最容易犯的错
很多人会写成:
- 右边进来一个元素
- 条件不满足时疯狂缩左边
但没有明确知道“什么时候该缩”“缩到什么程度”。
这通常说明窗口条件并没有定义清楚。
结论
滑动窗口真正让人变快的地方,不是代码更短,而是:
把大量重复区间计算,变成了可维护的增量更新。
一旦你能看见这个结构,很多连续区间题都会变得清晰很多。