滑動視窗總結

2021-10-19 11:19:19 字數 2176 閱讀 5831

滑動視窗思想:

①)視窗由兩個指標構成,乙個左指標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的滑動視窗型別題就總結到這裡了。如有錯誤,望君不吝指出,大家一起學習,一起進步。

滑動視窗總結

乙個序列中,滿足某些條件的,子串的,最長 最短 個數。時間複雜度分析 暴力解法的時間複雜度一般為o n 3 o n 2 列舉所有的子串,o n 判斷是否滿足條件。滑動視窗在兩個方面都降低時間複雜度 首先並不列舉所有的子串,只列舉可能包含答案的那些。其次通過記錄視窗內子串的一些資訊,使得判斷是否滿足條...

滑動視窗總結

本部落格基於大佬的題解 滑動視窗是一種高階的雙指標演算法,一般用於字串匹配問題 最小覆蓋子串 找到字串中所有字母異位詞 無重複字元的最長子串 字串的排列 滑動窗的基本思路就是維護乙個視窗,不斷滑動。該演算法的大致邏輯如下 int left 0,right 0 while right s.size 演...

滑動視窗總結

1.我們使用雙指標的思路,初始定義兩個指標,left right 0,把索引閉區間 left,right 看作乙個滑動視窗 2.然後不斷增加right的值,直到視窗中的字串符合要求 3.然後,停止增加right的值,轉而增加left的值,直到視窗中的字串不符合要求,每次增加left,就要更新一輪結果...