本次题目
347 前 K 个高频元素
- 队列:使用Map实现优先级队列(跟堆相同,队列内部有序排列,头部是最大值为大顶堆,头部为最小值为小顶堆)。
- 这里使用小顶堆(定义时构造大小对比方法),先使用Map存储数组中的数及其出现次数,然后将Map中元素依次压入小堆栈。
- 当顶堆的大小等于要求的k时,压入元素时与堆顶元素进行判断,若小于堆顶则不操作,若大于堆顶,则将堆顶元素弹出,压入新元素。
- 最后,顶堆中剩下的k个元素为频率最高的元素(弹出倒序)。
- 注意:PriorityQueue大顶堆右大于左,小顶堆左大于右。使用entrySet遍历Map获取键值对(keySet和values分别只获取键和值)。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for(int i : nums){
if(!map.containsKey(i)){
map.put(i, 0);
}
map.put(i, map.get(i) + 1);
}
int[] res = new int[k];
PriorityQueue<Map.Entry<Integer, Integer>> priQueue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
if(priQueue.size() >= k){
if(entry.getValue() > priQueue.peek().getValue()){
priQueue.poll();
priQueue.offer(entry);
}
}else{
priQueue.offer(entry);
}
}
for(int i = k - 1; i >= 0; i--){
res[i] = priQueue.poll().getKey();
}
return res;
}
}