用到了小顶堆,始终在堆里保持k个当前高频的元素,堆口是元素中最低频的,用于随时切换;
注意一下堆存二维数组,以及map的迭代方式:
Map.Entry<Integer,Integer> entry : map.entrySet()class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer,Integer> map = new HashMap<>(); PriorityQueue<int[]> p = new PriorityQueue<>((p1,p2) -> p1[1] - p2[1]); for(int i = 0;i < nums.length;i++){ map.put(nums[i],map.getOrDefault(nums[i],0) + 1); } for(Map.Entry<Integer,Integer> entry : map.entrySet()){ if(p.size() < k){ p.add(new int[]{entry.getKey(),entry.getValue()}); }else{ if(entry.getValue() > p.peek()[1]){ p.poll(); p.add(new int[]{entry.getKey(),entry.getValue()}); } } } int[] res = new int[k]; for(int j = k - 1;j >= 0;j--){ res[j] = p.poll()[0]; } return res; } }