Leetcode複習小結: Sliding Window

已經好久沒有更新了,目前的刷題情況是:已經作了600+道題,基本覆蓋全部常見類型,拿到一道題通常有思路或者大體的方向,easy和偏簡單的median基本沒問題,難度較大的題目作不作得出來主要看類型。contest從一開始的一兩道甚至一道都作不出到如今三道甚至四道(題目比較簡單常規時)。可是回過頭去看作過的這些題水分仍是有的,作過的題作不出來或者有思路寫不出bug free的代碼是常有的事情,因此新開了一個section按tag重刷一遍,尤爲是高頻。以後複習完每一個專題會來這邊簡單地寫寫小結,但願別坑掉。數組

Sliding Window
Sliding Window的本質:對於每個尾指針j,使用移動頭指針i的方式,求以j結尾的知足條件的最長或最短的subarray。時間複雜度通常爲O(N),由於頭指針i和尾指針j只能move forward,不能backward。
當題目要求最長或最短的subarray時考慮用sliding window,看對於每個以j結尾的subarray,頭指針i是否只能向前移動,若是是的能夠用sliding window解決,若是i能夠向後移動就考慮其餘解法。典型的題目如:指針

340 Longest Substring with At Most K Distinct Characters
這兩道都用的是HashMap+count
992 Subarrays With K Different Integers:這道題是340的拓展,關鍵在於:
exactly(K) = most(K) - most(K-1)
424 Longest Repeating Character Replacementcode

還有一種sliding window是移動一個固定長度的窗口,例如
567 Permutation in String:HashMap+count
239 Sliding Window Maximum
1100 Find K-Length Substrings With No Repeated Characters
480 Sliding Window Median
這一類的題目都是考慮一個「進出」的問題,窗口每移動一個單位,就把最左邊不在窗口裏的刪掉,把最右邊的加進窗口中leetcode

還有一些沒有歸類到Sliding Window,但我的以爲用到了Sliding Window思想的題目:
795. Number of Subarrays with Bounded Maximumget

Subarray sum
看到和subarray sum相關的題目,第一反應是從prefix sum入手。雖然切入點都是prefix sum,但具體處理起來方法不少
560 Subarrays sum equal to K:求和爲K的subarray的個數。用HashMap存儲distinct prefix sum和其個數
1074 Number of Matrix that sum to target: 560的延伸,從一維到二維。基本方法仍是同樣的,重點是如何將二維數組壓縮成一維數組。具體實現我會在二維數組部分進行總結(若是我真的寫了的話。。。)
209.subarray sum equals k:給一個正數數組,求使得和>=s的最短subarray的長度。這道題有一種O(N)解法和一種O(NlogN)的解法。O(N):Sliding window, O(NlogN): TreeMap/Binary Search,這裏TreeMap記錄的是前綴和和其index
ps: 這道題裏全部數都是正數,若是會出現負數怎麼處理呢?
這就是862. Shortest Subarray with Sum at Least K,須要用到deque,和Sliding Window Maximum解法比較相似,本質是monotonic queue,關於這個問題以後有空再總結string

相關文章
相關標籤/搜索