优先队列,需要学习一下优先队列的自定义排序,而且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