给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
/*
PriorityQueue(优先队列),一个基于优先级堆的无界优先级队列。
实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆。
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小顶堆,默认容量为11
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大顶堆,容量11
@Override
public int compare(Integer i1,Integer i2){
return i2-i1;
}
});
*/
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
// 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
map.put(nums[i], map.get(nums[i]) + 1);
} else {
map.put(nums[i], 1);
}
}
// 遍历map,用最小堆保存频率最大的k个元素
PriorityQueue<Integer> queue = 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 (queue.size() < k) {
queue.add(key);
} else if (map.get(key) > map.get(queue.peek())){
queue.remove();
queue.add(key);
}
}
List<Integer> ans = new ArrayList<>();
// 取出最小堆中的元素
while (!queue.isEmpty()) {
ans.add(queue.remove());
}
return ans;
}
}
使用优先队列解决高频元素问题
该博客介绍了一个利用优先队列(PriorityQueue)解决找出整数数组中出现频率最高的k个元素的方法。首先,通过HashMap统计每个元素的频率,然后创建一个自定义比较器的大顶堆,将频率作为比较依据。最后,从堆中依次取出频率最高的元素,构建答案列表。此方法适用于数据结构和算法的学习与实践。
2429

被折叠的 条评论
为什么被折叠?



