问题描述
给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。
你所设计算法的时间复杂度必须优于 O(n log n),其中 n 是数组大小。
输入
nums: 一个正整数数组k: 一个整数
返回
返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。
参数限制
1 <= nums[i] <= 10^41 <= nums.length <= 10^5k的取值范围是[1, 数组中不相同的元素的个数]- 题目数据保证答案唯一,换句话说,数组中前
k个高频元素的集合是唯一的
测试样例
样例1:
输入:
nums = [1, 1, 1, 2, 2, 3], k = 2
输出:"1,2"
解释:元素1出现了3次,元素2出现了2次,元素3出现了1次。因此前两个高频元素是1和2。
样例2:
输入:
nums = [1], k = 1
输出:"1"
问题理解
我们需要找到数组 nums 中出现频率前 k 高的元素,并按升序排列。时间复杂度必须优于 O(n log n),其中 n 是数组的大小。
数据结构选择
- 哈希表(字典) :用于统计每个元素的出现频率。
- 最小堆(Min Heap) :用于维护前
k个高频元素。
算法步骤
- 统计频率:使用哈希表统计每个元素的出现频率。
- 构建最小堆:遍历哈希表,将元素及其频率插入最小堆中。如果堆的大小超过
k,则弹出堆顶元素(即频率最小的元素)。 - 提取结果:从堆中提取元素,按升序排列。
关键步骤解释
- 统计频率:遍历数组
nums,使用字典frequency记录每个元素的出现次数。 - 构建最小堆:使用
heapq模块的heappush和heappop方法维护一个大小为k的最小堆。堆中存储的是元素的频率和元素本身。 - 提取结果:从堆中依次弹出元素,并按升序排列。
提示
- 你可以先尝试实现统计频率的部分。
- 然后尝试使用
heapq模块来维护最小堆。 - 最后,按升序排列结果并返回。
def solution(nums, k): # 统计频率 frequency = {} for num in nums: if num in frequency: frequency[num] += 1 else: frequency[num] = 1
# 构建最小堆
import heapq
min_heap = []
for num, freq in frequency.items():
heapq.heappush(min_heap, (freq, num))
if len(min_heap) > k:
heapq.heappop(min_heap)
# 提取结果
result = []
while min_heap:
result.append(heapq.heappop(min_heap)[1])
# 按升序排列
result.sort()
return result
if name == "main": # You can add more test cases here print(solution([1,1,1,2,2,3], 2) == [1,2]) print(solution([1], 1) == [1])