题目解析
这道题目要求我们找出一个整数数组中出现频率前 k 高的元素,并以字符串形式返回,元素之间用逗号分隔,且按升序排列。题目要求算法的时间复杂度必须优于 O(n log n),其中 n 是数组的大小。
思路
-
统计频率:首先,我们需要统计数组中每个元素出现的次数。这可以通过 Python 的
collections.Counter类实现,它能够高效地统计元素出现的频率。 -
排序:然后,我们需要将统计结果按照频率降序排列,如果频率相同,则按照元素值升序排列。这可以通过
sorted函数实现,其中key参数用于指定排序的依据。 -
提取结果:最后,从排序后的结果中提取前 k 个元素,并确保它们是按数值升序排列的。
图解
输入:nums = [1, 1, 1, 2, 2, 3], k = 2
步骤1:统计频率
Counter(nums) -> Counter({1: 3, 2: 2, 3: 1})
步骤2:排序
sorted(Counter(nums).items(), key=lambda x: (-x[1], x[0])) -> [(1, 3), (2, 2), (3, 1)]
步骤3:提取结果
[1, 2]
代码详解
from collections import Counter
def solution(nums, k):
# 统计每个元素出现的次数
count = Counter(nums)
# 将字典转换为列表,并根据元素出现的次数降序排序
freq = sorted(count.items(), key=lambda x: (-x[1], x[0]))
# 取出前 k 个元素的值,并确保它们是按数值升序排列的
result = [item[0] for item in freq[:k]]
# 因为已经按照数值升序排列了,所以直接返回结果
return result
if __name__ == "__main__":
# 测试用例
print(solution([1,1,1,2,2,3], 2)) # 输出应为 [1, 2]
print(solution([1], 1)) # 输出应为 [1]
print(solution([4,4,4,2,2,2,3,3,1], 2)) # 输出应为 [2, 4]
知识总结
-
Counter 类:
Counter类是 Python 中一个非常有用的工具,可以用来统计元素出现的频率。 -
排序:在 Python 中,
sorted函数可以用来对列表进行排序,其中key参数可以用来指定排序的依据。 -
列表推导式:列表推导式是一种简洁的方式来创建列表。
学习计划
-
制定刷题计划:首先,选择一些与该题目类似的题目进行练习,逐步提高自己的编程能力。
-
利用错题进行针对性学习:在刷题过程中,遇到不会的题目要及时查阅资料,并记录下来,以便日后复习。
-
总结经验:在刷题过程中,总结自己的经验和心得,不断优化自己的学习方法