维护一个窗口在数组/字符串上滑动,用于解决子串/子数组问题

什么是滑动窗口

滑动窗口是一种处理连续子数组/子串问题的技巧。通过维护一个可变大小的窗口,在数组上从左向右滑动,避免重复计算。

🎯 为什么使用?

将 O(n²) 或 O(n³) 的暴力枚举优化到 O(n)。当问题涉及连续子数组/子串的最值、计数或存在性判断时,滑动窗口是首选。

⚙️ 如何工作?

1. 右边界扩展:不断将新元素加入窗口 2. 左边界收缩:当窗口不满足条件时,移除左边元素 3. 更新答案:在适当的时机(扩展时或收缩时)更新最优解 4. 核心:每个元素最多被加入和移除窗口各一次,总时间 O(n)

🎨 形象比喻

想象用一个可伸缩的框在一排数字上滑动。框右边不断扩大,直到不满足条件;然后左边收缩,直到重新满足条件。不断重复,记录过程中符合要求的最大/最小框。

🔍 识别关键词

当你在题目中看到以下关键词时,考虑使用滑动窗口

连续子数组子串最长最短包含不重复窗口

📊 时间空间复杂度

时间复杂度
O(n)
空间复杂度
O(k),k为字符集大小

每个元素最多被访问两次(进入和离开窗口),窗口用哈希表存储

?查看快捷键