借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
维护一个元素数目为 k 的最小堆
每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
最终,堆中的 k 个元素即为前 k 个高频元素
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> count = new HashMap<>();
for(int num: nums){
count.put(num, count.getOrDefault(num, 0) + 1);
}
PriorityQueue<Integer> minHeap
= new PriorityQueue<>(k, (a,b) -> count.get(a) - count.get(b));
for(int num: count.keySet()){
if(minHeap.size() < k){
minHeap.offer(num);
}else if(count.get(num) > count.get(minHeap.peek())){
minHeap.poll();
minHeap.offer(num);
}
}
int[] res = new int[k];
// Descending order
for(int i = k - 1; i >= 0; i--){
res[i] = minHeap.poll();
}
return res;
}
}