滑動窗口(不與單調隊列結合的總結)
·題目
LeetCode 209. 長度最小的子數組
LeetCode 3. 無重復字符的最長子串
LeetCode 76. 最小覆蓋子串
LeetCode 134. 加油站
LeetCode 1234. 替換子串得到平衡字符串
LeetCode 992. K 個不同整數的子數組
LeetCode 395. 至少有 K 個重復字符的最長子串
·名字
滑動窗口
·地位
提升效率:通過動態調整窗口范圍,避免暴力枚舉所有可能的子區間,從而將時間復雜度從 O (N^2) 或更高優化到 O (N)
·用途
1.解決子數組和子串相關的問題
2.區域范圍內最大值
·核心原理
窗口范圍和答案要求有單調性關系(求最短的滿足和為target的子串(全部>=0),那么范圍越大和越大)
·大流程
子數組在以某個位置開頭或結尾下的答案
·單調性
LeetCode 992. K 個不同整數的子數組
LeetCode 395. 至少有 K 個重復字符的最長子串
其中,這兩題在學的時候對單調性產生了疑問,兩者可以對比一下
疑問:嚴格等于k意味著沒有單調性,可是窗口右邊界右移時,“不同整數的數量” 可能增加,左邊界右移時,數量又可能減少,為什么沒有單調性?假設這個真的沒有單調性,那395 我們要把字符種類數量規定為require是>=k的最長子串,那這里為什么是嚴格等于require?
單調性: 窗口擴張 / 縮小時,“目標條件是否滿足” 的變化是單向、可預測的
問題一
方法一:直接把這個試
那么你就會發現,你不知道什么時候該把數字吐出來
nums = [1,2,1,2,3], k = 2
在[2,1], [1,2,1],[1,2,1,2]中,你不知道該不該縮小左邊界
原因是什么? 不具有單調性!
這里你不論是吐數字還是吞數字,都會破壞嚴格等于k這個要求
所以往左縮會把有些答案丟了
方法二:對比解釋(用豆包輔助)
對比 “有單調性” 和 “無單調性” 的場景
場景 1:“最多 k 個不同元素”(有單調性)
當目標是「子數組最多有 k 個不同元素」時:
右邊界右移(擴張窗口):“不同元素數” 只會不變或增加 → 若增加到k+1,則不滿足 “最多 k”;
左邊界右移(收縮窗口):“不同元素數” 只會不變或減少 → 收縮后一定≤k。
此時,“是否滿足條件” 的變化是單向的:右移擴張易 “破界”(從滿足→不滿足),左移收縮易 “回歸”(從不滿足→滿足)。左右指針只需單向移動(右指針盡量右移,左指針僅在右指針導致破界時右移,且不會左移),符合單調性。
場景 2:“恰好 k 個不同元素”(無單調性)
當目標是「子數組恰好有 k 個不同元素」時:
右邊界右移:“不同元素數” 可能從k→k+1(不滿足 “恰好 k”);
左邊界右移:“不同元素數” 可能從k→k-1(也不滿足 “恰好 k”)。
此時,“是否滿足條件” 的變化是來回波動的(滿足→不滿足→滿足→不滿足…),沒有 “單向趨勢”。左右指針無法 “一直朝一個方向滑”,必須來回調整(比如右移后不滿足,左移又可能滿足,再右移又不滿足…),這就失去了滑動窗口的高效性(滑動窗口的優勢是 O (n),若指針來回走,復雜度會退化)。
滑動窗口的 “單調性”,不是指 “數量的增減”,而是指 “條件滿足與否的變化方向是單向的”
問題二
這里嚴格等于require滑動后的篩選,與窗口框架無關,框架是與<=require有關,所以具備單調性
綜上所述
研究單調性,一定是要研究會影響答案的關鍵值的單調性,不要把篩選條件融為一體
提煉方法
當遇到嚴格等于為關鍵值的時候,轉換為<=k
咳咳,要不要仔細校準一下,容易眼花QAQ,作者:江海一歸客,原文鏈接:http://www.rzrgm.cn/jhygk/p/19066996

浙公網安備 33010602011771號