您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關LeetCode如何找出滑動窗口的最大值的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
給定一個數組 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
right>=k
) 移除老的左邊界值:
如果它恰好是最大值, 也移除單調數據結構中對應的值right>=k-1
) 將單調數據結構中保存的最大值加入最終結果中class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
# 單調雙端隊列, 左邊存窗口最小值, 右邊存窗口最大值
q = collections.deque()
res = []
left = 0
for right in range(len(nums)):
# 步驟1 (當加入當前值后窗口長度會超過 k 時, 即right>=k) - 移除老的左邊界值: 如果它恰好是最大值, 也移除隊列尾
# 注意左邊界如果不是最大值的話, 不會存在于隊列中, 因為它后面總有更大的值將左邊界從隊列中淘汰出去 (步驟2的操作)
if right >= k:
if nums[left] == q[-1]:
q.pop()
left += 1
# 步驟2 (可以和步驟1互換位置) - 加入新的右邊界值: 此時需要先不斷移除隊列左側最小值, 直到當前新值成為新的最小值再插入左側, 因為更小的值絕不可能成為最大值的候選項(又舊, 值又小)
# 注意這里需要是小于而不能是小于等于, 因為如果當最小值等于當前值且都被移除的話, 如果它恰好也是最大值, 那么下次移除左邊界的時候就會錯誤地將當前的值給移除, 而不是移除左邊界對應的那個值, 這樣會導致后面的最大值計算出現錯誤
while q and q[0] < nums[right]:
q.popleft()
q.appendleft(nums[right])
# 步驟3 (當加入當前值后窗口長度達到 k 時, 即right>=k-1) - 將隊列右側最大值加入最終結果中
if right >= k - 1:
res.append(q[-1])
return res
感謝各位的閱讀!關于“LeetCode如何找出滑動窗口的最大值”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。