优先队列
题目描述:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
测试样例
示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1]
解题思路:
先将每一个元素的频率用HashMap存储起来,再构建一个小顶堆用来根据元素频率排序,每一次添加都淘汰堆顶最小的元素,最后剩下的就是出现频率最高的k个元素。
难点:
PriorityQueue的创建,PriorityQueue里要存储Entry对象。 PriorityQueue<Map.Entry<Integer,Integer>> deque = new PriorityQueue<>((o1,o2) -> o1.getValue() - o2.getValue());
代码实现:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
int len = nums.length;
for(int i = 0;i < len;i++){
map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
}
Set<Map.Entry<Integer,Integer>> entris = map.entrySet();
PriorityQueue<Map.Entry<Integer,Integer>> deque = new PriorityQueue<>((o1,o2) -> o1.getValue() - o2.getValue());
for(Map.Entry<Integer,Integer> entry : entris){
deque.offer(entry);
if(deque.size() > k){
deque.poll();
}
}
int[] res = new int[k];
for(int i = k - 1;i >= 0;i--){
res[i] = deque.poll().getKey();
}
return res;
}
}
|