高 进阶
滑动窗口模板#
一句话答案#
滑动窗口解决子串/子数组问题:右指针扩张维护窗口状态,不满足条件时左指针收缩,适合最长/最短子串类题。
核心要点
模板: left=0, 遍历right扩张窗口 → while(需收缩) left++ → 更新答案
适用场景: 最小覆盖子串 / 无重复最长子串 / 固定窗口最大和 / 最多K个不同字符
面试回答(2分钟版)
滑动窗口是解决子串和子数组问题的高效模板,核心思路是用左右双指针维护一个窗口。右指针不断向右扩张窗口并更新窗口状态,当窗口不满足约束条件时左指针向右收缩直到条件重新满足,每次扩张或收缩时更新最优答案。模板三步:右扩、左缩、更新答案。关键的区别在于求最长还是最短:求最长子串时在窗口合法的状态下更新答案,求最短子串时在窗口刚好满足条件时更新答案。比如无重复字符的最长子串,用HashMap记录字符位置,右指针遇到重复字符就把左指针跳到重复位置的下一个;最小覆盖子串则是窗口包含所有目标字符时记录答案并尝试收缩。滑动窗口本质是把暴力的O(n^2)双层循环优化到O(n),因为左右指针各自最多遍历数组一次。适用场景包括连续子数组最大和、最多K个不同字符的最长子串、固定窗口大小的最大平均值等。
追问与易错
追问方向:
- “固定窗口和可变窗口的区别?”→ 固定窗口大小不变,每次右移一格同时左边界也移一格;可变窗口根据条件动态收缩左边界,适用于求满足条件的最长/最短子数组
- “窗口收缩条件怎么确定?”→ 求最长则在不满足约束时收缩,求最短则在满足条件时收缩;关键是明确「何时窗口非法」并用 while 循环持续收缩
- “什么题型适合滑动窗口?”→ 连续子数组/子串问题,如最长无重复子串、最小覆盖子串、定长子数组最大和、含 K 个不同字符的最长子串等
易错点:
- ❌ 滑动窗口能解决所有子串问题——有些需要 DP
- ❌ 窗口一定是连续的——是的子数组/子串都是连续的