Leetcode刷题(13) 滑动窗口最大值(单调队列专用)

Leetcode刷题(13) 滑动窗口最大值(单调队列专用)

具体方法参考labuladong的特殊数据结构:单调队列,python重写

239. 滑动窗口最大值

import collections
# 创建一个单调队列的类, 队头大--->队尾小
class MonotonicQueue(object):
    def __init__(self):
        # 创建一个双向list
        self.queue = deque()

    def getmax(self):
        # 得到单调队列里面的最大值(队头)
        if len(self.queue) > 0:
            return self.queue[0]

    def popout(self, n):
        # 由于n很可能已经被后面来的更大的元素给排出了队列中, 所以先要判断一下是否存在先
        if self.queue[0] == n:
            # 如果在的话, 该元素就是队头
            return self.queue.popleft()
    
    def pushin(self, n):
        # 和单调栈很像, 如果当前元素比队尾元素大, 则队尾元素出队
        while(len(self.queue) > 0 and self.queue[-1] < n):
            self.queue.pop()
        # 从队尾入队接受审判
        self.queue.append(n)

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        res = list()
        windows = MonotonicQueue()

        # 下面的代码虽然符合逻辑但是最后得到的结果会少一个
        # for i in range(len(nums)):
        #     if (i < k):
        #         q.pushin(nums[i])
        #     else:
        #         res.append(q.getmax())  # 这里get的max其实是i-1的
        #         q.popout(nums[(i - 1) - k + 1])  # 这里退出的元素也是i-1的
        #         q.pushin(nums[i])

        for i in range(len(nums)):
            # 在windows里面有k个之前,一直加进
            if (i < k-1):
                windows.pushin(nums[i])
            else:
                # 加入第k个,
                windows.pushin(nums[i])
                # 得到window里面的最大值
                res.append(windows.getmax())
                # 得到window中的最大值之后再删除窗口中的最后一个元素
                windows.popout(nums[i - k + 1])
                
        return res

            



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值