题目:
算法思想:
利用了优先队列中的小顶堆的特性。首先利用HashMap统计每个元素出现的次数。然后利用优先队列维护出现次数最多的K个元素。当有大于堆顶的键值对出现时,就将堆顶键值对删除。
代码:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->(pair1[1]-pair2[1]));
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(pq.size()<k){
pq.offer(new int[]{entry.getKey(),entry.getValue()});
}else{
if(entry.getValue()>pq.peek()[1]){
pq.poll();
pq.offer(new int[]{entry.getKey(),entry.getValue()});
}
}
}
int[] result = new int[k];
for(int i=k-1;i>=0;i--){
result[i] = pq.poll()[0];
}
return result;
}
}