题目链接
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
解题思路
# 思路:堆(优先队列)
# 1.初始化计数器:使用defaultdict(int)可以简化计数过程。这样,当我们试图访问一个还未计数的元素时,它的值会自动被初始化为0。
# 2.统计每个元素的频率:遍历整个数组,对每个元素进行计数。
# 3.初始化堆:这里使用了一个堆(heap)来存储频率最高的k个元素。堆是一种特殊的树形数据结构,
# 续:它满足堆属性:即每个父节点的值都小于或等于其子节点的值(对于最小堆)或大于或等于其子节点的值(对于最大堆)。
# 续:这里我们使用的是最小堆。
# 4.填充堆:
#* 当堆的大小小于k时,我们将元素和其频率添加到堆中。
#* 当堆的大小达到k时,我们检查当前元素的频率是否大于堆顶元素的频率(即频率最高的元素的频率)。
# 续:如果是,我们将堆顶元素弹出,并将当前元素和其频率添加到堆中。
#* 使用`(val, key)`这样的元组作为堆的元素是因为`heapq`库默认是最小堆,而我们希望根据频率(即元组的第一个元素)对元素进行排序。
# 5. 返回结果:最后,我们将堆中的元素按key提取出来并返回,得到频率最高的前k个元素。
解题代码
class Solution:
def topKFrequent(self,nums, k):
count = collections.defaultdict(int)
for num in nums:
count[num] += 1
heap = []
for key, val in count.items():
if len(heap) < k:
heapq.heappush(heap, (val, key))
else:
if val > heap[0][0]:
heapq.heappop(heap)
heapq.heappush(heap, (val, key))
return [key for val, key in heap]
参考资料:力扣热题100对应的题解