前往
大廳
主題

LeetCode - 239. Sliding Window Maximum 解題心得

Not In My Back Yard | 2021-10-24 00:00:05 | 巴幣 2 | 人氣 354

題目連結:


題目意譯:
你被定一整數陣列 nums,且有著一個大小 k 滑動窗口(Sliding Window)從陣列最左移動到最右。你只能看見窗口中的 k 個數字。每次窗口將往右移動一個位置。

回傳每個滑動窗口的最大值。

限制:
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 ,並維護其非遞增性(也就是從頭到尾看的話,數字是非嚴格遞減的)。

當窗口移動到下一個位置時,就判斷 deque 的前端是不是已經超出窗口範圍,如果是就將其移出佇列。然後再維護佇列之性質。如此便可以得知每個窗口的最大值,而該值將位於 deque 的前端。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

LOVe高橋李依
哇!!開心
沒想到能看到leetcode有這題,等我coding再進步點一定要去做一次

這個function超有用的,而且超快....,記得某次做project,那時不知道能這樣slide,就傻傻的去寫loop,結果run了>>>>>1h都沒完。後來用了numpy.lib.stride_tricks.sliding_window_view(跟這題一樣原理,不過是2d array)后run time 直接變成了0.3s。真的超級震撼。
2021-10-24 01:22:38

更多創作