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