給你乙個整數陣列 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 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...