1. /**
    2. * 就是用优先队列解决问题,特别经典的一个case
    3. * 值得深入记忆
    4. */
    5. class Solution {
    6. public int[] topKFrequent(int[] nums, int k) {
    7. Map<Integer,Integer> map = new HashMap<>();
    8. for(Integer i : nums){
    9. map.put(i,map.getOrDefault(i,0) + 1);
    10. }
    11. PriorityQueue<Integer[]> priorityQueue = new PriorityQueue<Integer[]>(k, new Comparator<Integer[]>() {
    12. @Override
    13. public int compare(Integer[] o1, Integer[] o2) {
    14. Integer num1 = o1[1];
    15. Integer num2 = o2[1];
    16. return num1.compareTo(num2);
    17. }
    18. });
    19. for(Map.Entry<Integer,Integer> entry : map.entrySet()){
    20. Integer key = entry.getKey();
    21. Integer num = entry.getValue();
    22. if(priorityQueue.size() == k){
    23. if(priorityQueue.peek()[1] < num){
    24. priorityQueue.poll();
    25. priorityQueue.add(new Integer[]{key,num});
    26. }
    27. }else {
    28. priorityQueue.add(new Integer[]{key,num});
    29. }
    30. }
    31. int[] ret = new int[k];
    32. for (int i = 0; i < k; ++i) {
    33. ret[i] = priorityQueue.poll()[0];
    34. }
    35. return ret;
    36. }
    37. }