『算法』『數(shù)據(jù)結(jié)構(gòu)』 淺談滑動窗口算法(思想)[雙指針法中的左右指針法]束析,理解程序員必懂必會的計算機(jī)常見算法——滑動窗口算法(思想)[雙指針法中的左右指針法]

基本認(rèn)識

滑動窗口算法的本質(zhì)是雙指針法中的左右指針法,滑動窗口算法是雙指針法中的左右指針法更為形象的一種表達(dá)方式冕碟。

滑動窗口算法可以用以解決數(shù)組拦惋、字符串子元素問題。所謂滑動窗口安寺,就像描述的那樣厕妖,可以理解成是一個會滑動的窗口,每次記錄下窗口的狀態(tài)挑庶,再找出符合條件的適合的窗口言秸。它可以將嵌套的循環(huán)問題,更高效的解決迎捺。

基本思想與原理

滑動窗口算法举畸,可以將雙層嵌套的循環(huán)問題,轉(zhuǎn)換為單層遍歷的循環(huán)問題凳枝。使用兩個指針一左一右構(gòu)成一個窗口抄沮,就可以將二維循環(huán)的問題轉(zhuǎn)化成一維循環(huán)一次遍歷,相當(dāng)于通過舊有的計算結(jié)果對搜索空間進(jìn)行剪枝岖瑰,使時間復(fù)雜度從O(n2)降低至O(n)叛买。

適用的問題

滑動窗口算法,可以用來解決一些查找滿足一定條件連續(xù)區(qū)間性質(zhì)(長度等)的問題蹋订。
往往類似于“請找到滿足xx的最x的區(qū)間(子串率挣、子數(shù)組等)的xx”這類問題都可以使用該方法進(jìn)行解決。

求解的步驟與模板

滑動窗口算法的解題步驟是這樣(以在字符串S中,找最小的子元素使之包含字符串T為例):

(1)初始化窗口
我們在字符串 S 中使用雙指針中的左右指針技巧露戒,初始化 left = right = 0难礼,把索引閉區(qū)間 [left, right] 稱為一個「窗口」。

(2)尋找可行解
我們先不斷地增加 right 指針擴(kuò)大窗口 [left, right]玫锋,直到窗口中的字符串符合要求(包含了 T 中的所有字符)蛾茉。

(3)優(yōu)化可行解
此時,我們停止增加 right撩鹿,轉(zhuǎn)而不斷增加 left 指針縮小窗口 [left, right]谦炬,直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同時节沦,每次增加 left键思,我們都要更新一輪結(jié)果。

(4)滑動窗口甫贯,直至一次遍歷結(jié)束:
重復(fù)第 2 和第 3 步吼鳞,直到 right 到達(dá)字符串 S 的盡頭。

這個思路其實也不難理解叫搁,第 2 步相當(dāng)于在尋找一個「可行解」赔桌,然后第 3 步在優(yōu)化這個「可行解」供炎,最終找到最優(yōu)解。左右指針輪流前進(jìn)疾党,窗口大小增增減減音诫,窗口不斷向右滑動。

以上思路是比較形象的滑動窗口問題的解題步驟雪位,這類題通常要尋找比較具體的窗口竭钝。因為滑動窗口算法是雙指針法中的左右指針法更為形象的一種表達(dá)方式,因此有的雙指針法中的左右指針法問題所求解比較抽象雹洗,沒有具體的窗口香罐,這就要求我們結(jié)合實際題目做出分析。

引例部分

最小覆蓋字串問題:

在這里插入圖片描述

解題思路:
這個題我們可以使用滑動窗口算法时肿,既然是找最小的窗口穴吹,我們就先定義一個最小的窗口,也就是長度為零的窗口嗜侮。

在這里插入圖片描述

我們比較一下當(dāng)前窗口所在的位置的字母港令,是否為T中的一個字母。很顯然锈颗,A是ABC中的一個字母顷霹,也就是所求的最小子串可能包含當(dāng)前窗口,于是我們將窗口擴(kuò)大击吱,直至其包含T所有字符淋淀。
在這里插入圖片描述

此時,我們找到了一個能滿足條件的窗口覆醇,為了找到一個更小的的能滿足條件的窗口朵纷,我們從左開始縮小窗口,直至縮小后的窗口無法滿足條件永脓,記錄該窗口的狀態(tài)袍辞,更新結(jié)果數(shù)據(jù)。

之后我們再從右邊開始擴(kuò)大窗口常摧,不斷重復(fù)上面的步驟搅吁,直到窗口滑倒最右邊,且找不到合適的窗口為止落午。結(jié)果數(shù)據(jù)中的窗口狀態(tài)就是我們所求的谎懦。


在這里插入圖片描述

實戰(zhàn)部分

無重復(fù)字符的最長字串問題:

在這里插入圖片描述

解題思路:
其實就是一個隊列,比如例題中的 abcabcbb,進(jìn)入這個隊列(窗口)為 abc 滿足題目要求溃斋,當(dāng)再進(jìn)入 a界拦,隊列變成了 abca,這時候不滿足要求梗劫。所以享甸,我們要移動這個窗口截碴!我們只要把隊列的左邊的元素移出就行了,直到滿足題目要求枪萄!一直維持這樣的隊列,不斷更新最長窗口的狀態(tài)猫妙,當(dāng)窗口移動至最右端且無法優(yōu)化時瓷翻,記錄中最長窗口的狀態(tài)即為所求。

下面附上Python3的題解代碼

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:
            return 0
        left = 0
        lookup = set()                                #定義為set形式去重
        max_len = 0
        cur_len = 0
        for i in range(len(s)):
            cur_len += 1
            while s[i] in lookup:
                lookup.remove(s[left])
                left += 1
                cur_len -= 1
            if cur_len > max_len:
                max_len = cur_len
            lookup.add(s[i])
        return max_len

趁熱打鐵 刷題練習(xí)部分(持續(xù)更新)

**以下是LeetCode題庫中一些用到滑動窗口算法(思想)的經(jīng)典例題的題目及解析割坠,有題干齐帚,有題解代碼、有解題思路(持續(xù)更新):
**

No.3.無重復(fù)字符的最長子串:
https://blog.csdn.net/LanXiu_/article/details/104026241

No.11.盛最多水的容器:
https://blog.csdn.net/LanXiu_/article/details/104085783

NO.15.三數(shù)之和:
https://blog.csdn.net/LanXiu_/article/details/104085783

No.16.最接近的三數(shù)之和:
https://blog.csdn.net/LanXiu_/article/details/104085787

No.18.四數(shù)之和:
https://blog.csdn.net/LanXiu_/article/details/104085787

No.30.串聯(lián)所有單詞的子串:
https://blog.csdn.net/LanXiu_/article/details/104121026

No.42.接雨水:
https://blog.csdn.net/LanXiu_/article/details/104177349

No.75.顏色分類:
https://blog.csdn.net/LanXiu_/article/details/104253545

No.76.最小覆蓋子串:
https://blog.csdn.net/LanXiu_/article/details/104253984

No.88.合并兩個有序數(shù)組:
https://blog.csdn.net/LanXiu_/article/details/104282405

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子悄谐,更是在濱河造成了極大的恐慌沧奴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浪耘,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)孝常,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚓哩,“玉大人构灸,你說我怎么就攤上這事“独妫” “怎么了喜颁?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長曹阔。 經(jīng)常有香客問我半开,道長,這世上最難降的妖魔是什么赃份? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任稿茉,我火速辦了婚禮,結(jié)果婚禮上芥炭,老公的妹妹穿的比我還像新娘漓库。我一直安慰自己,他們只是感情好园蝠,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布渺蒿。 她就那樣靜靜地躺著,像睡著了一般彪薛。 火紅的嫁衣襯著肌膚如雪茂装。 梳的紋絲不亂的頭發(fā)上怠蹂,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音少态,去河邊找鬼城侧。 笑死,一個胖子當(dāng)著我的面吹牛彼妻,可吹牛的內(nèi)容都是我干的嫌佑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼侨歉,長吁一口氣:“原來是場噩夢啊……” “哼屋摇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幽邓,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炮温,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牵舵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柒啤,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年畸颅,在試婚紗的時候發(fā)現(xiàn)自己被綠了白修。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡重斑,死狀恐怖兵睛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窥浪,我是刑警寧澤祖很,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站漾脂,受9級特大地震影響假颇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骨稿,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一笨鸡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坦冠,春花似錦形耗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至判呕,卻和暖如春倦踢,著一層夾襖步出監(jiān)牢的瞬間送滞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工辱挥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留犁嗅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓晤碘,卻偏偏與公主長得像褂微,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哼蛆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容