劍指 Offer 59 I 滑動視窗的最大值

2021-10-09 06:46:49 字數 981 閱讀 3410

給定乙個陣列 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...