维护一个窗口在数组/字符串上滑动,用于解决子串/子数组问题
❓ 什么是滑动窗口?
滑动窗口是一种处理连续子数组/子串问题的技巧。通过维护一个可变大小的窗口,在数组上从左向右滑动,避免重复计算。
🎯 为什么使用?
将 O(n²) 或 O(n³) 的暴力枚举优化到 O(n)。当问题涉及连续子数组/子串的最值、计数或存在性判断时,滑动窗口是首选。
⚙️ 如何工作?
1. 右边界扩展:不断将新元素加入窗口
2. 左边界收缩:当窗口不满足条件时,移除左边元素
3. 更新答案:在适当的时机(扩展时或收缩时)更新最优解
4. 核心:每个元素最多被加入和移除窗口各一次,总时间 O(n)
🎨 形象比喻
「想象用一个可伸缩的框在一排数字上滑动。框右边不断扩大,直到不满足条件;然后左边收缩,直到重新满足条件。不断重复,记录过程中符合要求的最大/最小框。」
🔍 识别关键词
当你在题目中看到以下关键词时,考虑使用滑动窗口:
连续子数组子串最长最短包含不重复窗口
📊 时间空间复杂度
时间复杂度
O(n)
空间复杂度
O(k),k为字符集大小
每个元素最多被访问两次(进入和离开窗口),窗口用哈希表存储
按?查看快捷键