查找热点数据问题
问题描述
给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。
你所设计算法的时间复杂度必须优于 O(n log n),其中 n 是数组大小。
输入
- nums: 一个正整数数组
- k: 一个整数
返回
返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。
参数限制
- 1 <= nums[i] <= 10^4
- 1 <= nums.length <= 10^5
- k 的取值范围是 [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"
样例3:
输入:
nums = [4, 4, 4, 2, 2, 2, 3, 3, 1], k = 2
输出:"2,4"
思路一:用Hash表存储每个数据的个数,然后输出前k的数据。
from collections import Counter
# 统计每个元素出现的次数
count = Counter(nums)
# 根据频率对元素进行排序,如果频率相同则按元素值排序
sorted_items = sorted(count.items(), key=lambda x: (x[1], x[0]))
# 提取前k个最频繁的元素,注意这里是从后往前取k个,因为排序是从小到大
top_k = [item[0] for item in sorted_items[-k:]]
# 按照题目要求,结果需要按升序排列
top_k.sort()
# 转换成字符串形式输出
return ','.join(map(str, top_k))
- 使用一个哈希表(字典)来统计数组
nums中每个元素出现的次数。 - 将这个字典转换成一个列表,其中每个元素是一个元组,包含原数组中的值及其对应的频率。
- 对这个列表根据频率进行排序。如果两个元素的频率相同,则按数值大小排序。
- 从排序后的列表中提取前
k个元素,并将它们按升序排列。 - 将这些元素转换为字符串格式并返回。
用的collections中的Counter,这是Python标准库中Counter类,能快速实现计数功能,但其实也能手搓一个Counter。
对于一个计数器,就是加一个字典,如果nums在字典中,就把这个数加一,如果不存在,就加入这个数值为1.