高频元素提取问题解析| 豆包MarsCode AI 刷题

111 阅读2分钟

题目解析

这道题目要求我们找出一个整数数组中出现频率前 k 高的元素,并以字符串形式返回,元素之间用逗号分隔,且按升序排列。题目要求算法的时间复杂度必须优于 O(n log n),其中 n 是数组的大小。

思路

  1. 统计频率:首先,我们需要统计数组中每个元素出现的次数。这可以通过 Python 的 collections.Counter 类实现,它能够高效地统计元素出现的频率。

  2. 排序:然后,我们需要将统计结果按照频率降序排列,如果频率相同,则按照元素值升序排列。这可以通过 sorted 函数实现,其中 key 参数用于指定排序的依据。

  3. 提取结果:最后,从排序后的结果中提取前 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]

知识总结

  1. Counter 类Counter 类是 Python 中一个非常有用的工具,可以用来统计元素出现的频率。

  2. 排序:在 Python 中,sorted 函数可以用来对列表进行排序,其中 key 参数可以用来指定排序的依据。

  3. 列表推导式:列表推导式是一种简洁的方式来创建列表。

学习计划

  1. 制定刷题计划:首先,选择一些与该题目类似的题目进行练习,逐步提高自己的编程能力。

  2. 利用错题进行针对性学习:在刷题过程中,遇到不会的题目要及时查阅资料,并记录下来,以便日后复习。

  3. 总结经验:在刷题过程中,总结自己的经验和心得,不断优化自己的学习方法