view_week滑动窗口

滑动窗口题型:怎么识别、怎么讲、怎么练

滑动窗口不只是模板,而是一种把暴力枚举区间转成“扩张 + 收缩”过程的思考方式,所以它几乎统治了子串和子数组面试题。

覆盖题量

50+

推荐起手

写代码前先判断是定长窗口还是变长窗口。

高频误区

收缩条件写反,导致合法窗口被过早丢掉。

什么时候该想到这个模式

题目明确是连续区间、子串或子数组。
目标通常是求最长、最短,或者统计满足条件的区间数量。
暴力写法往往是双重枚举所有区间,复杂度明显过高。

下手前的检查清单

写代码前先判断是定长窗口还是变长窗口。
先写清楚进入窗口和离开窗口时要维护什么状态。
明确窗口何时有效、何时必须收缩。
只有在窗口满足题目要求时再更新答案。

真正适合面试表达的解题步骤

1

先确认答案确实可以由一个移动的连续区间推导出来。

2

选好窗口状态:和、不同元素个数、频次、匹配字符数等。

3

右指针扩张时立刻更新状态。

4

左指针只在窗口失效或超长时收缩。

5

用收缩后的有效窗口去更新答案。

常见变体

定长窗口

适合题目直接给定窗口长度,例如所有长度为 k 的子串。

变长窗口

适合条件由计数、和、覆盖关系决定,需要在失效时移动左边界。

窗口 + 频次数组

适合窗口合法性由重复字符或频次约束决定的情况。

模板预览

Python公开预览
# Variable size sliding window
left = 0
window = {}
answer = 0

for right, value in enumerate(nums):
    add(window, value)
    while not is_valid(window):
        remove(window, nums[left])
        left += 1
    answer = update(answer, left, right, window)

# Fixed size sliding window
window = initialize(nums[:k])
answer = evaluate(window)
for right in range(k, len(nums)):
    remove(window, nums[right - k])
    add(window, nums[right])
    answer = update(answer, right - k + 1, right, window)

更像真实刷题路径的推荐题单

这组题不是随机罗列,而是按“先建立识别感,再补关键变体,最后上强度”去排,适合真的拿来做一轮 pattern 复习。

高频坑点

warning

收缩条件写反,导致合法窗口被过早丢掉。

warning

窗口还没合法就更新答案。

warning

左指针移动时忘了同步移除状态。

warning

把定长窗口和变长窗口逻辑混在同一套循环里。

练习顺序建议

1

先刷定长窗口和频次数组题,例如排列匹配类。

2

再刷基础变长窗口,例如最短子数组和。

3

然后做覆盖型窗口,例如最小覆盖子串。

4

最后回头做需要计数器和多条件维护的高难混合题。

滑动窗口题型总结 | LeetCode 高频面试模式 - Interview AiBox