题目:
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
思路:
主要是记录一下这个生成最小堆的队列 PriorityQueue
通过最小堆队列实现取最大值
代码:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] res = new int[k];
if(nums.length==0||k==0){
return res;
}
Map<Integer,Integer> map = new HashMap<>();
for(int e:nums){
if(map.containsKey(e)){
map.put(e,map.get(e)+1);
}else{
map.put(e,1);
}
}
// 遍历map,用最小堆保存频率最大的k个元素
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return map.get(a) - map.get(b);
}
});
for(Integer key:map.keySet()){
if(pq.size()<k){
pq.add(key);
}else if(map.get(key)>map.get(pq.peek())){
pq.remove();
pq.add(key);
}
}
for(int i=0;i<k;i++){
res[i] = pq.remove();
}
return res;
}
}