leetcode专题训练 239. Sliding Window Maximum

优先队列,需要学习一下优先队列的自定义排序,而且python的优先队列的get函数会在取队头的同时将其弹出(注意priorityqueue没有que[0]这个操作,只能通过queue.get()取元素,collections的deque有que[0]操作,可取队列头)。

import queue

class Node:
    def __init__(self, num, index):
        self.num = num
        self.index = index
    
    # 自定义排序
    def __lt__(self, other):
        if self.num == other.num:
            return self.index < other.index
        return self.num > other.num

    def __str__(self):
        return "num :%d , index :%d" % (self.num, self.index)

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        if not nums:
            return []
        
        l = len(nums)
        k = min(l, k)
        
        result = []
		
		# 优先队列定义
        que = queue.PriorityQueue()
        now = 0
        for i in range(l):
            if now != k:
                now += 1
                
            else:
                maxNode = que.get()
                while maxNode.index < i-k:
                    maxNode = que.get()
                result.append(maxNode.num)
                que.put(maxNode)

            que.put(Node(nums[i], i))

        maxNode = que.get()
        while maxNode.index < l-k:
            maxNode = que.get()

        result.append(maxNode.num)

        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值