思路:定义一个双端单调队列,首先先把前K个数放入队列中,放入队列的同时求最大值,遍历数字,如果要进入的数字大于队列中已存在的数字,弹出比该数字小的数字,如果要进入的数字小于队列末端的数字,该数字加入队列。这样队列的首部始终是最大值。
这道题目属于hard级,一刷跟着卡尔的视频顺下来的代码。
from collections import deque
class MyQueue:
def __init__(self):
self.queue=deque()
def pop(self,val):
if self.queue and val==self.queue[0]:
self.queue.popleft()
def push(self,val):
while self.queue and val>self.queue[-1]:
self.queue.pop()
self.queue.append(val)
def front(self):
return self.queue[0]
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
que=MyQueue()
result=[]
for i in range(k):
que.push(nums[i])
result.append(que.front())
for i in range(k,len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
result.append(que.front())
return result
思路:字典记录每个元素出现频率,根据出现频率建立小根堆;输出小根堆
一刷跟着卡尔视频顺下来的代码
heapq默认实现小根堆
import heapq
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
map_={}
for i in range(len(nums)):
map_[nums[i]]=map_.get(nums[i],0)+1
pre_que=[]
for key,freq in map_.items():
heapq.heappush(pre_que,(freq,key))
if len(pre_que)>k:
heapq.heappop(pre_que)
result=[0]*k
for i in range(k-1,-1,-1):
result[i]=heapq.heappop(pre_que)[1]
return result