K大K小问题
前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
class Solution {
/**
优先队列 + HashMap:
先HashMap统计元素的频率
创建优先队列,根据频率从小到大存放元素,当队列元素超过k个时,出队,最后剩下k个元素就是频率最大的k个元素
*/
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) -> map.get(a) - map.get(b));
for(int num : map.keySet()){
queue.offer(num);
if(queue.size() > k){
queue.poll();
}
}
int[] res = new int[k];
for(int i = 0; i < k; i++){
res[i] = queue.poll();
}
return res;
}
}```