LeetCode中桶排序问题

桶排序算法常用于求解LeetCode中的Top K问题,如347. Top K Frequent Elements和692. Top K Frequent Words。通过创建与频率对应的桶,将元素分配到相应桶中,然后反向遍历桶,即可找到出现频率最高的前k个元素。此方法等同于建立一个数组,将出现次数作为数组下标,将元素放入对应位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

桶排序也是经常用于求topK的问题,leetcode中的典型题目下面这两题都是类似的:

Leetcode : 347. Top K Frequent Elements

Leetcode:692. Top K Frequent Words

  都是用桶排序解法。设置若干个桶,每个桶存储出现频率相同的数,并且桶的下标代表桶中数出现的频率,即第 i 个桶中存储的数出现的频率为 i。把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数。

可以理解为其实就是建立一个数组,因为某个数出现次数不可能超过数组长度,可根据某个数出现的次数将其放入数组中的对应位置(比如某个数出现了5次则放入下标为5的位置)

public List<Integer> topKFrequent(int[] nums, int k) {
    List<Integer> ret = new ArrayList<>();
    Map<Integer, Integer> frequencyMap = new HashMap<>();
    for (int num : nums) {
        frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
    }
    List<Integer>[] bucket = new List[nums.length + 1];
    for (int key : frequencyMap.keySet()) {
        int frequency = frequencyMap.get(key);
        if (bucket[frequency] == null) {
            bucket[frequency] = new ArrayList<>();
        }
        bucket[frequency].add(key);
    }

    for (int i = bucket.length - 1; i >= 0 && ret.size() < k; i--) {
        if (bucket[i] != null) {
            ret.addAll(bucket[i]);
        }
    }
    return ret;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值