347、前k个高频元素
题目要求
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路:
1、直接调库。(不推荐)
直接调用collections中的Counter计数器,再返回前k个最高频次的元素即可。
count = collections.Counter(nums)
return [item[0] for item in count.most_common(k)]
2、堆排序/单调队列
我们维护一个小根堆,堆顶即是当前堆内最小的元素。首先把前k个元素放入堆,接着放入一个新元素,进行一次向下调整,再把对顶元素pop出去,这样遍历一遍,小根堆内留下的就是最大的几个元素。(这里遍历的元素是频次)
自己手写一个堆需要先写向下调整函数,再写堆建立过程,比较麻烦,这里直接用python内置的模块 heapq。
heapq模块中的heapify函数可以将列表变成一个堆,默认是小根堆。
import heaqp
the_dict = {}
my_heap = []
for i in nums:
if i in the_dict:
the_dict[i] += 1
else:
the_dict[i] = 1
# 把数字和频率统计在一个字典中
val_list = list(the_dict.values())
# 先把k个频率值放入堆中
for i in range(k):
my_heap.append(val_list[i])
heapq.heapify(my_heap) # 把my_heap变成小顶堆
# 接着开始便利剩下的元素
for i in range(k, len(val_list)):
heap.heappushpop(my_heap, val_list[i])
return list(my_heap)