雙指標之滑動視窗總結

2021-10-16 09:03:50 字數 1222 閱讀 7495

這個星期做的都是有關雙指標和滑動視窗的有關leecode題。 同樣有點小感悟,這裡小小總結一下雙指標中的滑動視窗部分。

對於給定字串求其某個符合一定條件的子串的問題,最簡單的方法就是暴力的兩層迴圈,它的時間複雜度至少是o(n2)。 一般條件下,這樣的複雜的往往都會因為超時而「over」。

相對來說,如果能對暴力的兩個指標的移動進行優化(或者裁剪,避免很多已經不可能的指標移動),很多題目都可以使用滑動視窗的方式來解決。

滑動視窗說起來其實也很簡單,它主要是利用兩個指標在一維陣列中進行分別滑動,從而進行搜尋可行解的一種演算法。一般來說,兩個指標的滑動方向是一致的。

相比於利用兩個指標進行o(n2)的暴力演算法(兩層迴圈),這種演算法大大減少了複雜度(單從指標移動的角度來看,這種複雜度為o(n))。 在我看來,滑動視窗和直接的暴力求解的根本不同點就在於前者在每次指標移動的時候都進行了邏輯判斷,把不必要的條件都裁剪了,滑動的視窗裡留下的是可行解(也有可能沒有解)。

一般來說,left指標不會在right指標已經移到end端,才向右滑動;相反的,left會在視窗中的值已經滿足條件(或者不滿足條件,視具體的實現而定)就可以進行向右移動。移動後的在視窗左邊的元素不會再被考慮(如果視窗是往右滑動的話),因為包含滑動視窗左邊元素的所有最優情況已經都被考慮過了。

就這樣,一步一步滑動,一步一步進行視窗內元素檢測,最終可以確定最優的解。從某種程度上來說,這也是一種搜尋。和動態規劃有點像,一種自帶裁剪的搜尋演算法。

以上的內容都是抽象的總結概括,如果對滑動視窗不是很了解,可能覺得我總結的都是啥啥玩意。 這裡還是建議在其他地方了解、實踐一波。 ( * ^ ▽ ^ * )

上面說的是對滑動視窗的一些總結和介紹部分,這裡原來想結合leecode的題來點實現**來著。 但是發現自己寫的幾題關於滑動視窗的題都有點信馬由韁、不成體系,有點小亂,這裡就不再獻醜了。^ _ ^|||

這裡貼個關於滑動視窗的模板,看起來還挺不錯的。

/* 滑動視窗演算法框架 */

void

slidingwindow

(string s, string t)

}}

以上模板來自。 模板的作用是在理解的基礎上加快解題速度,事先還是要理解好原理的。

、我寫了一首詩,把所有滑動視窗問題變成了默寫題

雙指標到滑動視窗

1 判定鍊錶中是否含有環 解析 定義兩個指標,一快一慢。如果有環,則會相遇。boolean hascycle listnode head return false 2 已知鍊錶中含有環,返回這個環的起始位置 解析 快指標走了2k步,慢指標走了k步。多的k步就是環的長度。假設相遇點距離環起始位置m步,...

雙指標問題和滑動視窗問題

好幾天沒寫啦,不過這段時間一直都在做題,沒有一天拉下,這幾天寫了不少雙指標問題,動態規劃問題也在慢慢地熟練了,看資料,找規律,找前一 秒 的狀態,找出狀態轉換方程。到雙指標問題,我真是2分鐘就把問題怎麼解決想了出來,但是有一道題實現時候,總是答案不對,我也不知道為什麼,後來才發現,我只是大致的把指標...

雙指標遍歷 滑動視窗 42 接雨水

6.42 接雨水 上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 暴力解,o n o 1 class solution for int j i j size j ans math.min leftmax,right...