LeetCode中桶排序問題

桶排序也是經常用於求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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章