题目
TopK问题非常常见 今天学习了其中的一种解法 最小堆 也就是优先队列
首先我们一遍哈希 存下每个数字出现的次数
然后维护一个长度为K的优先队列
小于K时直接入队 等于K时判断是否大于队首元素(由于是升序队列所以大于最小的即可)
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int n:nums) {
if (map.containsKey(n))
map.put(n,map.get(n)+1);
else
map.put(n,1);
}
PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) -> map.get(a)-map.get(b));
for (int key: map.keySet()) {
if (queue.size() < k)
queue.add(key);
else if (map.get(key) > map.get(queue.peek())){
queue.poll();
queue.add(key);
}
}
int res[] = new int[k];
for (int i = 0; i < k; i++) {
res[i] = queue.poll();
}
return res;
}