演算法題:返回滑動視窗中的最大值

GetaChan發表於2019-11-28

題目來源於力扣

理論基礎

優先佇列

滑動視窗最大值

題目描述

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

解題思路

  1. 大頂堆

  2. 雙關佇列 deque

Python 解法

# k 視窗大小
def maxSlidingWindow(self, nums, k):
    if not nums: return []
    window, res = [], []
    for i,x in enumerate(nums):
        # window 存下標,i-k超出左界則刪除最左元素
        if i >= k and window[0] <= i - k:
            window.pop[0]
        # 比x小的元素都應該刪除
        while window and nums[window[-1]] <=x
            window.pop()
        window.append(i)
        if i >= k - 1:
            res.append(nums[windows[0]])
    return res

相關文章