【力扣】239:滑動窗口最大值 | 維護單調隊列

題目描述

給定一個數組 nums,有一個大小爲 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 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

算法思路

最簡單的方法,維持滑動窗口的單調隊列。

每滑動一下,窗口就丟掉一個值,加入一個值,就需要維護隊列。

        def add(n):
            while True:
                if not ls or ls[-1]>=n:
                    ls.append(n)
                    break
                else:
                    ls.pop()
        def delete(n):
            if ls and ls[0]==n:
                    ls.pop(0)

完整算法

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        if not nums:return []
        
        def add(n):
            while True:
                if not ls or ls[-1]>=n:
                    ls.append(n)
                    break
                else:
                    ls.pop()
        def dep(n):
            if ls and ls[0]==n:
                    ls.pop(0)
                
        ls=[]
        for i in range(k):
            add(nums[i])
        res=[]
        for i in range(k-1,len(nums)):
            res.append(ls[0])
            dep(nums[i+1-k])
            if i+1<len(nums):
                add(nums[i+1])
        return res

執行用時 :88 ms, 在所有 Python3 提交中擊敗了65.88%的用戶
內存消耗 :17.1 MB, 在所有 Python3 提交中擊敗了100.00%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章