class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//用map统计频数
HashMap<Integer,Integer> map = new HashMap<>();
for(int i:nums){
if(map.containsKey(i)){
map.put(i,map.get(i)+1);
}else{
map.put(i,1);
}
}
//用小顶堆把map中元素都存进去
PriorityQueue<Integer> heap =
new PriorityQueue<>((x,y)->(map.get(x)-map.get(y)));
for(Integer i :map.keySet()){
heap.add(i);
}
//弹出堆顶元素,知道剩下k个,即最高频的k个
while (heap.size()>k){
heap.poll();
}
//但是要注意堆顶是k个里面频数最小的
ArrayList<Integer> list = new ArrayList<>();
while (!heap.isEmpty()){
list.add(heap.poll());
}
//所以需要反转list,按从大到小进行存储
Collections.reverse(list);
return list;
}
}