每日leetcode 滑動視窗演算法總結

2021-09-21 02:08:02 字數 2781 閱讀 5112

參考自:vx:

滑動問題包含乙個滑動視窗,它是乙個執行在乙個大陣列上的子列表,該陣列是乙個底層元素集合。

假設有陣列 [a b c d e f g h ],乙個大小為 3 的 滑動視窗 在其上滑動,則有:

[a b c]

[b c d]

[c d e]

[d e f]

[e f g]

[f g h]

一般情況下就是使用這個視窗在陣列的 合法區間 內進行滑動,同時 動態地 記錄一些有用的資料,很多情況下,能夠極大地提高演算法地效率

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。

返回滑動視窗最大值。

示例:

輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

輸出: [3,3,5,5,6,7]

解釋:

滑動視窗的位置 最大值

--------------- -----

[1 3 -1] -3 5 3 6 7 3

1 [3 -1 -3] 5 3 6 7 3

1 3 [-1 -3 5] 3 6 7 5

1 3 -1 [-3 5 3] 6 7 5

1 3 -1 -3 [5 3 6] 7 6

1 3 -1 -3 5 [3 6 7] 7

解析:

利用乙個 雙端佇列,在佇列中儲存元素在陣列中的位置, 並且維持佇列的嚴格遞減,,也就說維持隊首元素是 最大的 ,當遍歷到乙個新元素時, 如果佇列裡有比當前元素小的,就將其移除佇列,以保證佇列的遞減。當佇列元素位置之差大於 k,就將隊首元素移除。

deque的一些用法:

deque兩端都能夠快速插入和刪除元素,但是在頭部插入元素和使用insert()方法在中間插入元素都不會新增元素,而是會覆蓋原來的元素

deq.front():返回第乙個元素的引用。

deq.back():返回最後乙個元素的引用。

deq.push_front(x):把元素x插入到雙向佇列的頭部。

deq.pop_front():彈出雙向佇列的第乙個元素。

deq.push_back(x):把元素x插入到雙向佇列的尾部。

deq.pop_back():彈出雙向佇列的最後乙個元素。

class solution 

q.push_back

(i);

if(q.

front()

==i-k)

//滿了

if(i>=k-1)

}return res;}}

;

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

示例 1:

輸入: 「abcabcbb」

輸出: 3

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

示例 2:

輸入: 「bbbbb」

輸出: 1

解釋: 因為無重複字元的最長子串是 「b」,所以其長度為 1。

示例 3:

輸入: 「pwwkew」

輸出: 3

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

請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。

思路:當出現重複字元時,拋棄重複出現的字元前一次出現的位置,把新的子串開始位置設定為其+1來統計子串長度,最後得出最長的子串長度。

dict存的是每個字元最後一次出現的位置,start是無重複字串開始的位置

c++**

class solution 

dict[s[i]

]= i;

maxlen =

max(maxlen, i - start);}

return maxlen;}}

;

給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。

示例:輸入: s = 7, nums = [2,3,1,2,4,3]

輸出: 2

解釋: 子陣列 [4,3] 是該條件下的長度最小的連續子陣列。

高階:如果你已經完成了o(n) 時間複雜度的解法, 請嘗試 o(n log n) 時間複雜度的解法。

解析:定義兩個指標 left 和 right ,分別記錄子陣列的左右的邊界位置。

(1)讓 right 向右移,直到子陣列和大於等於給定值或者 right 達到陣列末尾;

(2)更新最短距離,將 left 像右移一位, sum 減去移去的值;

(3)重複(1)(2)步驟,直到 right 到達末尾,且 left 到達臨界位置

class solution 

else

if(sum>=s)}if

(result==n+1)

//所有的nums都加一起都不夠s

return0;

return result;}}

;

滑動視窗演算法

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

滑動視窗演算法

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

滑動視窗演算法

滑動視窗演算法可以用以解決陣列 字串的子元素問題,它可以將巢狀的迴圈問題,轉換為單迴圈問題,降低時間複雜度。給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。輸入 s abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。通過不斷滑動視窗的大小,判斷視窗中元...