桶排序
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> frequencyOfNums=new HashMap<Integer, Integer>();
for(int num:nums) {
frequencyOfNums.put(num, frequencyOfNums.getOrDefault(num, 0)+1);
}
//for循环结束,所有的数的频率就计算出来了
List<Integer>[] buckets=new ArrayList[nums.length+1];
for(int num:frequencyOfNums.keySet()) {
int frequency=frequencyOfNums.get(num);
if(buckets[frequency]==null) {
buckets[frequency]=new ArrayList<Integer>();
}
buckets[frequency].add(num);
}
List<Integer> topK=new ArrayList<Integer>();
for(int i=buckets.length-1;i>=0 && topK.size()<k;i--) {
if(buckets[i]==null) {
continue;
}
if(buckets[i].size()<=(k-topK.size())) {
topK.addAll(buckets[i]);
}else {
topK.addAll(buckets[i].subList(0, k-topK.size()));
}
}
return topK.stream().mapToInt(Integer::intValue).toArray();
}
}
设置若干个桶,每个桶存储出现频率相同的数。桶的下标表示数出现的频率,即第 i 个桶中存储的数出现的频率为 i。
把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数。
注意:
- 将Integer型的列表转换为int[]类型的数组使用列表.stream().mapToInt(Integer::intValue).toArray();
- 列表转换为数组使用toArray()方法
- 数组转化为列表使用asList()方法