topk 问题:最大堆求topk小,最小堆求 topk 大。 1)求topk大:构建一个 k 个数的最小堆,当读取的数大于根节点时,替换根节点,重新塑造最小堆。 2)求topk小:构建一个 k 个数的最大堆,当读取的数小于根节点时,替换根节点,重新塑造最大堆。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
my_map=dict()
#计算每个数出现频次
for i in range(len(nums)):
my_map[nums[i]]=my_map.get(nums[i],0)+1
#小顶堆,对频次进行排序
my_heap=[]
for key,freq in my_map.items():
#把freq,key作为二元组放入小顶堆
heapq.heappush(my_heap,(freq,key))
if len(my_heap)>k:
#若堆大于K,弹出堆顶元素,保证堆大小一直为k
heapq.heappop(my_heap)
#找出前K个高频元素,小顶堆先弹出最小,所以倒序输出到数组
res=[0]*k
for i in range(k-1,-1,-1):
#放入堆的是二元组(freq,key),key对应索引1
res[i]=heapq.heappop(my_heap)[1]
return res