347. 前 K 个高频元素

import collections
from typing import List

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        """
        找出 nums 数组中出现频率最高的前 k 个元素 (使用桶排序思想)。

        Args:
            nums: 整数数组。
            k: 需要返回的高频元素的数量。

        Returns:
            一个包含前 k 个高频元素的列表。
        """
        
        # 1. 统计频率
        # freq_map 的形式是 {元素: 频率}
        # 时间复杂度: O(N)
        freq_map = collections.Counter(nums)

        # 2. 创建桶数组
        # 桶的索引代表频率,范围从 0 到 len(nums)
        # buckets[i] 存储所有频率为 i 的元素列表
        # 时间复杂度: O(N) (初始化列表)
        # 空间复杂度: O(N) (最坏情况)
        n = len(nums)
        buckets = [[] for _ in range(n + 1)] 

        # 3. 元素入桶
        # 遍历频率映射,将元素放入对应频率的桶中
        # 时间复杂度: O(N'),N' 是不同元素的数量 (N' <= N)
        for num, freq in freq_map.items():
            buckets[freq].append(num)

        # 4. 按频率逆序收集结果
        result = []
        # 从最大可能的频率 n 开始,向下遍历到频率 1
        # 时间复杂度: O(N) (最坏情况遍历所有桶和元素)
        for i in range(n, 0, -1):
            # 如果当前频率 i 的桶不为空
            if buckets[i]:
                # 将该桶中的所有元素添加到结果中
                for num_in_bucket in buckets[i]:
                    result.append(num_in_bucket)
                    # 如果结果列表已达到 k 个,可以直接返回
                    if len(result) == k:
                        return result
        
        # 如果 unique 元素少于 k 个 (理论上题目保证 k 有效)
        return result

# 示例用法:
# solution = Solution()
# nums1 = [1,1,1,2,2,3]
# k1 = 2
# print(solution.topKFrequent(nums1, k1)) # 输出: [1, 2] (顺序可能不同)

# nums2 = [1]
# k2 = 1
# print(solution.topKFrequent(nums2, k2)) # 输出: [1]

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值