力扣:前k个高频元素java
流程:
- 设置一个map类型,将数组的值存入map中,key为值,value为出现频次。
- 设置一个小顶堆(优先对列,顶部存的一定是最小的值)
- 遍历map,将map类型转换为Map.entry的类型,才能遍历所有key和value
- 小顶堆的大小为k,当小顶堆的大小小于k时,直接输入从Map.Entry类型转化为数组的节点
- 否则判断该map值的value(频次)是否大于当前堆最小的节点(也就是顶点),大于则输出顶点,输入该节点
- 最后小顶堆倒叙出入结果集
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<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<int[]> pq = new PriorityQueue<>((p1,p2)->p1[1]-p2[1]);
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(pq.size()<k){
pq.add(new int[]{entry.getKey(),entry.getValue()});
}else{
if(entry.getValue()>pq.peek()[1]){
pq.poll();
pq.add(new int[]{entry.getKey(),entry.getValue()});
}
}
}
int[] result = new int[k];
for(int i=k-1;i>=0;i--){
result[i] = pq.poll()[0];
}
return result;
}
}