給定乙個陣列 nums 和滑動視窗的大小 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 總是有效的,在輸入陣列不為空的情況下,1 ≤ k ≤ 輸入陣列的大小。
注意:本題與主站 239 題相同:
通過次數37,904提交次數85,311
思路:
單調佇列,在遍歷陣列元素的時候維護乙個單調佇列,這樣可以在o(1)時間複雜度找到滑動視窗內的最大元素。原理如下:
單調佇列中儲存的都是階段性的最大值,比如佇列第乙個元素是2,就代表在陣列中,2之前沒有比2更大的元素,因此,從0到元素2的位置的最大值就是2;之後滑動視窗滑動的時候,不斷更新單調佇列:1.當滑動視窗左側劃出的元素剛好是單調佇列的隊頭元素的時候,將這個元素pop出去;2.在新的元素入佇列的時候,pop掉隊尾所有比這個元素小的元素。
class
solution
q.push_back
(nums[i]);
if(!q.empty()
&&i>=k&&q.
front()
==nums[i-k])if
(i>=k-
1)ret.
push_back
(q.front()
);}return ret;}}
;
劍指offer59 I 滑動視窗的最大值
題目描述 給定乙個陣列 nums 和滑動視窗的大小 k,請找出所有滑動視窗裡的最大值。解析解法一 沒有任何優化,直接擷取陣列,依次遍歷求各陣列最大值 public int maxslidingwindow int nums,int k maxnums i max return maxnums 解法二...
劍指 Offer 59 I 滑動視窗的最大值
給定乙個陣列 nums 和滑動視窗的大小 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...
劍指 Offer 59 I 滑動視窗的最大值
給定乙個陣列 nums 和滑動視窗的大小 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...