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