題目連結(jié):
題目意譯:
你被定一整數(shù)陣列 nums,且有著一個大小 k 滑動窗口(Sliding Window)從陣列最左移動到最右。你只能看見窗口中的 k 個數(shù)字。每次窗口將往右移動一個位置。
回傳每個滑動窗口的最大值。
限制:
1 ≦ nums.length ≦ 10 ^ 5
-10 ^ 4 ≦ nums[i] ≦ 10 ^ 4
1 ≦ k ≦ nums.length
範例測資:
範例 1:
輸入: 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
範例 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]
解題思維:
可以看到本題的滑動窗口中的最大值其實就是
這題中雙端佇列(Double-Ended Queue,簡稱 deque)中的前端元素。
因此,我們也可以按照該題的作法——宣告一個 deque ,並維護其非遞增性(也就是從頭到尾看的話,數(shù)字是非嚴格遞減的)。
當窗口移動到下一個位置時,就判斷 deque 的前端是不是已經(jīng)超出窗口範圍,如果是就將其移出佇列。然後再維護佇列之性質(zhì)。如此便可以得知每個窗口的最大值,而該值將位於 deque 的前端。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。