前k个一般都用堆,前k个明显用大顶堆
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();
int[] result = new int[k];
for(int i = 0; i < nums.length; i++){
Integer value = map.getOrDefault(nums[i], 0);
map.put(nums[i],value + 1 );
}
//利用堆排序获得前k个最大的,所以实现大顶堆
//参数是比较器,因为传入的是数组,数组第一个数是key,第二个数是value,所以第二个value - 第一个value看作大顶堆
PriorityQueue<int[]> queue = new PriorityQueue<>((a,b) -> b[1] - a[1]);
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
queue.offer(new int[]{entry.getKey(),entry.getValue()});
}
for(int i = 0; i < k; i++)
result[i] = queue.poll()[0];
return result;
}