LeetCode 347 前 K 个高频元素
题目描述
题目链接
给定一个整数数组 nums 和一个整数 k,请返回其中出现频率前 k 高的元素。
解题思路
哈希表 + 堆排序法
- 频率统计阶段:使用哈希表统计元素出现频率
- 堆排序优化:通过维护最小堆来快速获取前k大元素
- 结果提取:从堆中提取排序后的结果
步骤说明
# leetcode 347
# 前k个高频元素
# https://leetcode.cn/problems/top-k-frequent-elements/description/
# 解法:
from typing import List
import heapq
from collections import Counter
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
# 统计频率(哈希表O(n))
freq = Counter(nums) # 例如 nums=[1,1,2] → {1:2, 2:1}
# 构建堆元素(频率在前用于排序)
heap = [(count, num) for num, count in freq.items()] # [(2,1), (1,2)]
# 获取前k大元素(堆排序O(nlogk))
return [num for count, num in heapq.nlargest(k, heap)]
if __name__ == "__main__":
# 测试用例(题目示例)
nums = [1, 1, 1, 2, 2, 3]
k = 2
print(Solution().topKFrequent(nums, k)) # 预期输出:[1, 2]
关键点解析
-
最小堆的选择 :
- 维护容量为k的最小堆
- 新元素频率 > 堆顶时进行替换
- 最终堆中保留最大的k个元素
-
复杂度优化 :
- 直接排序复杂度:O(nlogn)
- 堆排序复杂度:O(nlogk)(k远小于n时优势明显)
时间复杂度:O(nlogk)
空间复杂度:O(n)