滑動視窗演算法

2022-01-09 22:19:55 字數 1257 閱讀 8981

滑動視窗演算法可以用以解決陣列/字串的子元素問題,它可以將巢狀的迴圈問題,轉換為單迴圈問題,降低時間複雜度。

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

輸入: s = "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

通過不斷滑動視窗的大小,判斷視窗中元素是否相同,從而解決問題。

我們在字串 s 中使用雙指標中的左右指標技巧,初始化 left = right = 0,把索引閉區間 [left, right] 稱為乙個「視窗」。

我們先不斷地增加 right 指標擴大視窗 [left, right],直到視窗中的字串符合要求(包含了 t 中的所有字元)。

此時,我們停止增加 right,轉而不斷增加 left 指標縮小視窗 [left, right],直到視窗中的字串不再符合要求(不包含 t 中的所有字元了)。同時,每次增加 left,我們都要更新一輪結果。

重複第 2 和第 3 步,直到 right 到達字串 s 的盡頭。

這個思路其實也不難,第 2 步相當於在尋找乙個「可行解」,然後第 3 步在優化這個「可行解」,最終找到最優解。左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動。

更多解法可以參考

class solution 

if (s.length() == 1)

if (s.length() == 2)

return 1;

}int max = 1;

int left = 0;

int length = s.length();

while (left < length-1)

for (int right=left+1; rightmax)

break;

}// 最後乙個了,前面還沒被攔截下來,這裡要做最終計算了

if (right == length - 1) }}

left ++;

}return max;

}// 是否滿足要求的子串,沒有重複的

public boolean check(string s, int left, int right)

}return true;}}

滑動視窗演算法

我們學習過計算機網路都知道為了避免擁塞發生,在網路傳輸時有滑動視窗協議控制傳輸時流量。該協議允許傳送方在停止並等待確認前傳送多個資料分組。由於傳送方不必每發乙個分組就停下來等待確認,因此該協議可以加速資料的傳輸,提高網路吞吐量。這個跟我們今天說的滑動視窗演算法是乙個原理。該演算法的作用就是將我們多層...

滑動視窗演算法

在letecode程式設計中經常會碰到一類尋找最長序列的問題,這個時候都可以採用滑動視窗的演算法 滑動視窗就是控制乙個雙指標left,right,沒有達到極限條件的時候right指標,操作臨界條件 就讓left指標,然後更新這個最長序列。比如下面的的問題 問題一 給你兩個長度相同的字串,s 和 t。...

滑動視窗演算法 演算法 滑動視窗 二

演算法 這算是滑動視窗的另外乙個典型題目,在資料量比較少的時候,可以直接採用暴力法解決 不過資料量比較大的時候,我們就需要想辦法解決視窗裡面最大值的思路,這裡我們採用雙端佇列queue來實現,借助 queue來儲存前面計算過的最大值資訊。題目 解法1 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...