參考自: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。通過不斷滑動視窗的大小,判斷視窗中元...