LeetCode刷题笔记第347题:前K个高频元素
想法:
统计所有元素的频次,并以此构建由K个元素组成的小顶堆,堆顶的根节点为此时堆中的最小值,遍历剩余元素与根节点比较,当大于根结点时将其替换并重新构建小顶堆,直至遍历完所有元素,此时堆中的K个元素即为前K个高频元素。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
count = collections.Counter(nums)
heap = []
for key, val in count.items():
if len(heap) >= k:
if val > heap[0][0]:
# 删除对顶的较小元素,添加新的较大元素
heapq.heapreplace(heap, (val, key))
else:
# 向堆中添加元素
heapq.heappush(heap, (val, key))
# 返回前K个高频元素
return [item[1] for item in heap]