题目描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
代码示例
import heapq
from collections import Counter
from typing import List
def topKFrequent(nums: List[int], k: int) -> List[int]:
# 计算每个元素的频率
count = Counter(nums)
# 创建一个最小堆来存储频率最高的 k 个元素
heap = []
# 遍历计数器中的元素和频率
for num, freq in count.items():
# 将元素及其频率加入堆中
heapq.heappush(heap, (freq, num))
# 如果堆的大小超过 k,则移除堆顶元素
if len(heap) > k:
heapq.heappop(heap)
# 从堆中提取前 k 个高频元素
top_k = [num for freq, num in heap]
return top_k
# 测试示例
test_nums = [1,1,1,2,2,3]
test_k = 2
topKFrequent(test_nums, test_k) # 应返回 [1, 2] 或 [2, 1]
当我第一次看到这个关于找出数组中出现频率前 k 高的元素的题目时,我并不确定如何解决它。这个问题看起来复杂,因为它不仅涉及到计算数组中每个元素的出现频率,还需要从这些频率中找出最高的 k 个。最初,我对于如何有效并且高效地实现这一点感到困惑。
然而,当我阅读了相关的代码和随想录之后,我意识到使用最小堆是解决这个问题的关键。通过构建一个最小堆来维护出现频率最高的 k 个元素,我可以在遍历完所有元素后,轻松地得到所需的结果。最小堆这一数据结构的使用巧妙地简化了问题,因为它自然而然地处理了元素的排序和存储问题。这种方法的效率和简洁性给我留下了深刻的印象,也让我认识到了在算法设计中数据结构选择的重要性。通过这个例子,我学到了面对看似复杂的问题时,找到合适的工具和方法是至关重要的。