2021 01 02 239 滑動視窗最大值

2021-10-13 18:13:13 字數 1977 閱讀 9954

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

返回滑動視窗中的最大值。

示例 1:

輸入:nums =[1

,3,-

1,-3

,5,3

,6,7

], k =

3輸出:[3,

3,5,

5,6,

7]解釋:滑動視窗的位置 最大值

----

----

-------

-----[

13-1

]-35

3673

1[3-

1-3]

5367

313[

-1-3

5]36

7513

-1[-

353]

6751

3-1-

3[53

6]76

13-1

-35[

367]

7

示例 2:

輸入:nums =[1

], k =

1輸出:[

1]

示例 3:

輸入:nums =[1

,-1]

, k =

1輸出:[1,-1]

示例 4:

輸入:nums =[9

,11], k =

2輸出:[

11]

示例 5:

輸入:nums =[4

,-2]

, k =

2輸出:[

4]

這個題目很好理解,就是在乙個陣列中有乙個固定寬度的滑動視窗,每次移動記錄滑動視窗中最大的值,最後返回包含每次最大的值的乙個陣列。

對於這個題目,最直接的想法就是按照題目的意思進行暴力迴圈。每次移動就把視窗中最大的值放在結果陣列中,最後返回結果陣列。這樣固然是能解決問題,但是我們執行**,似乎結果並不是很理想,執行超時了。49/60的測試用例執行通過,此時時間複雜度:o(n * k),空間複雜度:o(n),其中n是陣列nums的長度,k是滑動視窗的長度。

我們可以使用雙端佇列來解答這個題目。使用乙個雙端佇列來儲存滑動視窗中值的索引,並且保持這個佇列中第乙個值是最大的,這樣只需要遍歷一次nums,就可以獲取到每次移動中的最大值,具體步驟如下:

這種方法時間複雜度:o(n),空間複雜度:o(n),其中n是陣列nums的長度。

暴力迴圈實現(超時):

/**

* @param nums

* @param k

* @return

*/var

maxslidingwindow

=function

(nums, k)

return res

};

雙端佇列:

/**

* @param nums

* @param k

* @return

*/var

maxslidingwindow

=function

(nums, k)

queue.

push

(i)if

(i >= k -1)

}return res

};

雙端佇列:

Week5 D 滑動視窗滑動視窗

week5 d 滑動視窗滑動視窗 zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position ...

week5 D 滑動視窗滑動視窗

zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position minimum value max...

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

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