思路:和力扣215类似,多了先用哈希表存储每个元素出现次数的部分。然后遍历哈希表,依次放入容量为k的小顶堆,最后求堆顶即可。
public int[] topKFrequent(int[] nums, int k){
HashMap<Integer,Integer> map=new HashMap<>();
for(int num:nums){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}
else{
map.put(num,1);
}
}
PriorityQueue<Integer> minHeap=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return map.get(o1)-map.get(o2);
}
});
for(Integer key:map.keySet()){
if(minHeap.size()<k){
minHeap.add(key);
}
else if(minHeap.size()==k&&map.get(minHeap.peek())<map.get(key)){
minHeap.poll();
minHeap.add(key);
}
}
int[] res=new int[k];
int index=0;
while(!minHeap.isEmpty()){
res[index++]=minHeap.poll();
}
return res;
}