滑動視窗,簡單來說,就是以動態的邊界限定的一組元素。其中邊界限定的大小稱為視窗大小,邊界變化的幅度稱為滑動步長。
滑動視窗的應用場景有幾個特點:
需要輸出或比較的結果在原資料結構中是連續排列的;
每次視窗滑動時,只需觀察視窗兩端元素的變化,無論視窗多長,每次只操作兩個頭尾元素,當用到的視窗比較長時,可以顯著減少操作次數;
視窗內元素的整體性比較強,視窗滑動可以只通過操作頭尾兩個位置的變化實現,但對比結果時往往要用到視窗中所有元素。
如下圖表示的是乙個視窗大小為5,滑動步長為1的滑動視窗。
視窗一的左邊界為1,右邊界為5,包含1~5這五個元素。
當下一時刻,視窗整體向右滑動1,此時左邊界為2,右邊界為6,包含2~6這五個元素。
再下一時刻,視窗整體向右滑動1,此時左邊界為3,右邊界為7,包含3~7這五個元素。。。
補充:視窗的大小其實是不固定的,也就是說,當右邊界向右滑動1時,左邊界可以滑動1,也可以不滑動,還可以滑動任何大於0且小於視窗大小的值(如果大於視窗大小,就超過右邊界了)。
以下是一道力扣中的原題:
209. 長度最小的子陣列
給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的連續子陣列,並返回其長度。如果不存在符合條件的連續子陣列,返回 0。
示例:
輸入: s = 7, nums = [2,3,1,2,4,3]解:輸出: 2
解釋: 子陣列 [4,3] 是該條件下的長度最小的連續子陣列
class solution
rightpoint++;
}return result == integer.max_value ? 0 : result+1;}}
通常佇列這種資料型別非常適合滑動視窗,但是**中使用了雙指標來表示視窗的左右邊界。
先將右指標向右滑動,左指標不動,當左右指標表示的視窗中所有元素的sum值滿足條件,則更新滿足條件的最小視窗大小,並嘗試將左指標也向右移動。
左指標向右移動後,再次判斷是否仍然滿足條件,如果仍然滿足,則重複第二步。
直到不滿足條件時,繼續第一步的操作。
最後返回result。
滑動視窗演算法 演算法 滑動視窗 二
演算法 這算是滑動視窗的另外乙個典型題目,在資料量比較少的時候,可以直接採用暴力法解決 不過資料量比較大的時候,我們就需要想辦法解決視窗裡面最大值的思路,這裡我們採用雙端佇列queue來實現,借助 queue來儲存前面計算過的最大值資訊。題目 解法1 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...
演算法 滑動視窗
一.滑動視窗 滑動視窗其實就是高階版的雙指標技巧,只不過它依靠了資料結構 hashmap,hashset 的幫助,使得雙指標運用起來更加的靈活,更加的方便,他主要就是來解決子字串匹配問題。他主要的思路就是這樣的固定步驟 1 我們在字串 s 中使用雙指標中的左右指標技巧,初始化 left right ...
演算法 滑動視窗
最多可以將k個值從0變成1,因此滑動視窗的限制條件 0的數量 zeros 小於k,演算法過程如下 有乙個滑動視窗 slipper 每次都會從a中讀入乙個數 當讀入的數為0時,zeros 當zeros的數量大於k時,會取出slipper首部的元素,當取值為0時zeros 總體 如下 上述演算法效率並不...