剑指 Offer II 060. 出现频率最高的 k 个数字
原始题目链接:https://leetcode-cn.com/problems/g5c51o/
给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
解题思路:
这道题第347题的 前 K 个高频元素 是一样的踢,看代码及注释。
代码实现:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
# 先统计数字出现的频率,存到字典中,字典的key是数字,value是频数
nums_dict = {}
for num in nums:
nums_dict[num] = nums_dict.setdefault(num, 0) + 1
# 构建一个堆,堆的元素是元组(频数的负数, 数字)
# 取负数是因为python只有小根堆
heap = []
for key, value in nums_dict.items():
heapq.heappush(heap, (-value, key))
ans = []
# 弹出k个堆顶的元素到ans中
for _ in range(k):
ans.append(heapq.heappop(heap)[1])
return ans