前言:
這段時間課比較多,還要準備6級,所以題刷的有點慢。我把leetcode關於滑動視窗的免費題差不多都做了,現在總結一下套路,供以後複習用。
滑動視窗思想:
①)視窗由兩個指標構成,乙個左指標left
,乙個右指標right
,然後[left,right]
表示的索引範圍是乙個視窗了。
②)右指標right
的功能是用來擴充套件視窗:當視窗內的條件沒有達到題目要求時,我們需要不斷移動右指標right
直到視窗內的條件第一次滿足題目要求為止。
③)左指標left
的功能是用來縮小視窗的:當視窗內的條件已滿足題目條件或多於題目條件時(視窗溢位),我們縮小視窗,也就是左指標left
需要右移直到視窗條件不滿足為止。這時,我們需要記錄當前視窗的大小,並更新目前為止滿足條件的最小視窗記錄。之後,再次擴充套件右指標right
,使得視窗滿足題目的條件。
注:滑動視窗用來處理連續滿足一定條件的連續區間的性質(長度等)問題的,兩個指標都起始於原點,並一前一後向終點前進。
習題解析:
3. 無重複字元的最長子串:用set用來當視窗,用來存放遍歷到的字元,若沒有遇到重複字元,right繼續擴充套件,同時更新max;若遇到重複字元,我們需要縮小視窗,也就是left右移。具體可見:題解。
76. 最小覆蓋子串:用兩個hashmap(window
,needs
)來建立字元表,其中needs用來建立存放模式串t的字元表,window用來存放總串s中用來和needs匹配字元的字元表。當視窗的字元個數滿足needs時,我們需要更新子串的長度以及子串的起始位置,然後就是縮小視窗了。具體可見:題解。
239. 滑動視窗最大值:本題就是滑動視窗的練手題,第一種解法就是暴力法求解,當視窗的大小等於k時,我們需要將該視窗內的最大值新增到result中,同時右移左指標left將視窗縮小;當視窗的大小小於k時,我們進行滑動right就行了。
第二種解法使用雙向佇列作為視窗,來儲存陣列的下標,並保持視窗頭部的下標表示的元素為該視窗的最大值。具體可見:題解。
424. 替換後的最長重複字元:本題字元表來表示視窗,視窗的大小與最多字元個數之間的差值表示可以替換的字元個數,當可以替換的字元個數大於k時,我們需要縮小視窗,也就是left右移,直到可以替換的字元個數等於k時,我們可以得到結果。具體可見:題解。
438. 找到字串中所有字母異位詞:本題求的是模式串p在總串s中的所有字母異位詞,所以我們所建立的視窗windows大小維持在與模式串p生成的字元表needs的大小相等即可。具體可見:題解。
480. 滑動視窗中位數:對於暴力法求視窗內的中位數導致超時,所以我們使用multiset
利用其底層為二叉排序樹的資料結構來作為視窗,因為二叉排序樹,插入和刪除元素的時間複雜度為0(logn),所以我們利用其自排序功能可以很快的求出中位數。具體可見:題解。
567. 字串的排列:本題屬於438.找到字串中的所有字母異位詞
的子題,前者是找到所有異位詞並新增異位詞出現的下標,而本題比前者簡單多了,若在總串找到模式串的異位詞,直接返回ture就行了;若遍歷完整個總串也沒找到模式串的異位詞,返回false就行。具體可見:題解。
992.k個不同整數的子陣列:使用hashmap來表示視窗,具體可見:題解。
995.k連續位的最小翻轉次數:本題使用佇列來作為視窗,window用來存放被反轉元素的下標,window的長度表示反轉的次數。具體可見:題解。
978.最長湍流子陣列:當視窗到達陣列末尾或者湍流不成立,我們需要劃分視窗。具體可見:題解。
1040.移動石子直到連續ⅱ:具體可見:題解。
1052.愛生氣的書店老闆:對於不生氣的人數我們需要全部加上,我們的滑動視窗用來統計視窗大小為x內的不生氣人數,然後需要記錄所有視窗中最多的生氣人數,最後結果就是不生氣人數加上所有視窗中最多的生氣人數。具體可見:題解。
1074.元素和為目標值的子矩陣數量:對於每一行計算字首和,對於每一列計算行累加和,然後這個問題就變成和目標和子陣列相同了。具體可見:題解。
1208.盡可能使字串相等:口表示t和s的相對應的子字串做差值之後的cost。若視窗內的cost小於等於maxcost時,我們需要記錄最長的子字串;若cost大於maxcost的話,表示視窗溢位,我們需要縮小視窗了。具體可見:題解。
總結:
關於leetcode的滑動視窗型別題就總結到這裡了。如有錯誤,望君不吝指出,大家一起學習,一起進步。
leetcode刷題總結之遞迴
前言 最近刷完leetcode遞迴的專題了,無奈本人很菜,關於遞迴每次都是看大佬的題解,自己也設計不出來遞迴,今日打算從遞迴本質出發,徹底剖析遞迴。本文中的大部分遞迴思想來自 遞迴的內涵與經典應用。在數學與電腦科學中,遞迴 recursion 是指在函式的定義中使用函式自身的方法。實際上,遞迴,顧名...
leetcode刷題之239 滑動視窗的最大值
正確的解法是使用雙端佇列來處理這個window的功能。c deque有現成的stl可以使用 需要注意幾個點 1.需要維護佇列內部的最大值在隊首的位置,每次想要新增乙個新元素的時候就迴圈和前面的元素做比較 2.判斷乙個元素是否過期,可以直接用當前隊首和應該淘汰的數字進行對比如果一致就去除 主要邏輯 1...
LeetCode刷題總結
123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...