from collections import deque
class MyQueue:
def __init__(self):
self.queue=deque()#使用list会超时
def pop(self,value):
if self.queue and value==self.queue[0]:#看是否为空且要弹出的数值是否等于队列出口的值
self.queue.popleft()
def push(self,value):
while self.queue and value>self.queue[-1]:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]#返回队列内最大值,即队列前端
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que=MyQueue()
result=[]
for i in range(k):
que.push(nums[i])#先将前k的元素放进队列
result.append(que.front())#result 记录前k的元素的最大值
for i in range(k,len(nums)):
que.pop(nums[i-k])#滑动窗口移除最前面元素
que.push(nums[i])#滑动窗口加入最后面的元素
result.append(que.front())
return result
347.前k个高频元素
import heapq
class Solution:#定义小顶堆
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
map_={}
for i in range(len(nums)):#遍历统计元素出现频率
map_[nums[i]]=map_.get(nums[i],0)+1#是获取字典 map_ 中键为 nums[i] 的值,如果键不存在,则返回默认值 0
pri_que=[]#小顶堆,大小为k
for key,freq in map_.items():#扫描所有频率的数值
heapq.heappush(pri_que,(freq,key))#是将元组 (freq, key) 按照 freq 的大小顺序插入到优先队列 pri_que 中。
if len(pri_que)>k:#如果堆的大小大于k,则队列弹出,保证堆的大小一直为k
heapq.heappop(pri_que)
result=[0]*k
for i in range(k-1,-1,-1):#倒序输出,因为小顶堆弹出的是最小的
result[i]=heapq.heappop(pri_que)[-1]
return result