/**
* 就是用优先队列解决问题,特别经典的一个case
* 值得深入记忆
*/
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(Integer i : nums){
map.put(i,map.getOrDefault(i,0) + 1);
}
PriorityQueue<Integer[]> priorityQueue = new PriorityQueue<Integer[]>(k, new Comparator<Integer[]>() {
@Override
public int compare(Integer[] o1, Integer[] o2) {
Integer num1 = o1[1];
Integer num2 = o2[1];
return num1.compareTo(num2);
}
});
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
Integer key = entry.getKey();
Integer num = entry.getValue();
if(priorityQueue.size() == k){
if(priorityQueue.peek()[1] < num){
priorityQueue.poll();
priorityQueue.add(new Integer[]{key,num});
}
}else {
priorityQueue.add(new Integer[]{key,num});
}
}
int[] ret = new int[k];
for (int i = 0; i < k; ++i) {
ret[i] = priorityQueue.poll()[0];
}
return ret;
}
}