题目
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
思路
- 使用map集合统计数字出现的次数
- 使用桶排序,将相同出现次数的数字,存储到同一个桶子里头
- 最后从后往前,倒出来 k个数字即可
Java 代码
class Solution {
private Random random = new Random(45);
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// 将每一个的数字出现的次数,填入 map 中
for(int i=0; i<nums.length; i++){
int count = map.getOrDefault(nums[i], 0) + 1;
map.put(nums[i], count);
}
// 桶排序
List<Integer>[] lists = new List[nums.length+1];
for(int key:map.keySet()){
int value = map.get(key);
if(lists[value] == null){
lists[value] = new ArrayList<Integer>();
}
lists[value].add(key);
}
// 将桶排序中的从后往前倒出来
int count = 0;
int[] ans = new int[k];
// 这里的 count<k 是为了跳出循环做准备的
for(int i=lists.length-1; i>=0 && count < k; i--){
if (lists[i] == null) continue;
for(int num: lists[i]){
ans[count] = num;
count ++;
// 在同一个桶子里头倒出数字的时候,如果发现满足要求了,就跳出循环
if(count == k) break;
}
}
return ans;
}
}