题目:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
思路:
优先级队列,即堆
题目未要求按序输出,但我们这里的解答是按频率由高到低输出元素的。
按频率建立大小为k的小根堆,最终堆中将留下频率最高的k个元素。
(小根堆每次弹出最小的,最终堆中留下的是最大的几个元素)
解答:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
#统计元素出现频率
dic=defaultdict(int)
for num in nums:
dic[num]+=1
#使用大小为k的小根堆,对频率进行排序
heap=[]
for key,fre in dic.items():
heapq.heappush(heap,(fre,key))
#维持堆的大小为k
if len(heap)>k:
heapq.heappop(heap)
#输出前k个高频元素,每次弹出最小的
result=[0]*k
for i in range(k-1,-1,-1):
result[i]=heapq.heappop(heap)[1]
return result