滑动窗口是处理数组流中连续极值问题最直接高效的工具,用双指针控制动态区间并实时维护目标值,时间复杂度稳定为o(n);分固定长度(如求每个k子数组最值,用单调双端队列)和可变长度(如满足条件的最短/最长子数组,依赖单调性while收缩)两类;需依问题选合适状态结构(sum变量、哈希表、计数器等),并注意空输入、越界等边界鲁棒性处理。

滑动窗口是处理数组流中连续极值问题最直接高效的工具,关键在于用两个指针控制动态区间,并在移动中实时维护目标值(如最大、最小、和、长度等)。它不依赖全局遍历,每个元素最多被访问两次,时间复杂度稳定为 O(n)。
固定长度窗口:找每个 k 子数组的极值
典型场景:求每个长度为 k 的滑动窗口中的最大值或最小值(如 LeetCode 239)。
- 用双端队列(Deque)维护单调递减序列的索引,保证队首始终是当前窗口最大值的下标
- 每步操作三件事:删队尾比当前数小的索引(保单调)、加当前索引(扩窗)、删队首超出窗口范围的索引(缩窗)
- 当 right ≥ k − 1 时,开始记录结果——此时窗口已成型
可变长度窗口:找满足条件的最短/最长连续子数组
典型场景:和 ≥ target 的最小子数组长度(LeetCode 209)、无重复字符的最长子串(LeetCode 3)。
- 右指针持续右移“进窗口”,累加或记录新元素
- 一旦满足条件(如 sum ≥ target / 出现重复字符),立即用 while 循环左移“出窗口”,直到条件刚不满足
- 每次满足条件时更新答案(如取 min_length 或 max_length)
- 注意:该模式要求窗口内量具有单调性(如全正数数组的和随窗口扩大而增大)
窗口内状态管理:根据问题选合适结构
窗口不只是左右坐标,还需高效跟踪内部信息:
- 求和类问题(最小子数组、最大平均值):用整型变量 sum 累加,滑动时增减端点值
- 去重类问题(最长无重复子串):用数组哈希表(如 int hash[128])或 unordered_map 记录字符频次
- 多条件约束(如最多替换 k 个 0 得最长连续 1):用计数器统计“违禁元素”个数,控制其 ≤ k
边界与鲁棒性处理不能跳过
实际编码中容易忽略但必须显式判断:
- 输入为空、k 为 0 或大于数组长度 → 直接返回空结果或默认值
- 整个数组都无法满足条件(如所有数加起来仍
- 使用 int 最大值初始化答案(如 INT_MAX)时,最后要检查是否未更新,再决定返回值











