LeetCode中桶排序问题

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

Leetcode : 347. Top K Frequent Elements

Leetcode:692. Top K Frequent Words

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

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

public List topKFrequent(int[] nums, int k) {
    List ret = new ArrayList<>();
    Map frequencyMap = new HashMap<>();
    for (int num : nums) {
        frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
    }
    List[] 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;
}

 

你可能感兴趣的:(排序算法,数据结构)