public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
map.put(n, map.getOrDefault(n, 0) + 1);
}
// 小根堆,频率最少的在最顶上
PriorityQueue<Integer> pq = new PriorityQueue<>(k, (num1, num2) -> map.get(num1) - map.get(num2));
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (pq.size() < k) {
pq.offer(entry.getKey());
} else {
// 比堆里频率最小的元素要大,把这个元素移除
if (entry.getValue() > map.get(pq.peek())) {
pq.poll();
pq.offer(entry.getKey());
}
}
}
int[] res = new int[k];
for (int i = k - 1; i >= 0; i--) {
res[i] = pq.poll();
}
return res;
}