返回全部文章

滑动窗口:什么时候区间问题可以不用重算

滑动窗口和双指针经常一起出现,但它解决的问题更具体:

滑动窗口和双指针经常一起出现,但它解决的问题更具体:

当你在处理连续区间时,能不能把“每次重算”改成“增量维护”。

为什么滑动窗口很重要

很多区间问题最直接的做法都是:

  • 枚举区间左端点
  • 枚举区间右端点
  • 重新计算当前区间状态

这类做法通常复杂度很高,而且重复计算非常多。

滑动窗口的核心价值,就是把这些重复计算压掉。

什么时候该想到滑动窗口

我会先看这些信号:

  • 问题对象是连续子数组或连续子串
  • 暴力做法要反复计算区间信息
  • 区间在移动时,可以把新进入和移出的元素单独处理
  • 条件是“满足某种约束的最长/最短区间”

这类信号一出现,就很适合先试窗口。

滑动窗口的关键不是“滑”,而是“维护”

窗口真正难的点不在左右指针移动,而在于:

  • 当前维护的是什么状态
  • 当右端加入一个元素时怎么更新
  • 当左端移出一个元素时怎么回退

如果这个状态定义不清楚,窗口就会写得很乱。

常见用途

  • 最长不重复子串
  • 最小覆盖子串
  • 满足和/频次条件的最短区间
  • 固定长度区间统计

最容易犯的错

很多人会写成:

  • 右边进来一个元素
  • 条件不满足时疯狂缩左边

但没有明确知道“什么时候该缩”“缩到什么程度”。
这通常说明窗口条件并没有定义清楚。

结论

滑动窗口真正让人变快的地方,不是代码更短,而是:

把大量重复区间计算,变成了可维护的增量更新。

一旦你能看见这个结构,很多连续区间题都会变得清晰很多。