Leetcode——前 K 个高频元素
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——前 K 个高频元素相关的知识,希望对你有一定的参考价值。
1. 前 K 个高频元素
(1)优先队列
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> occurrences = new HashMap<Integer, Integer>();
for(int num :nums){
occurrences.put(num, occurrences.getOrDefault(num, 0)+1); //记录每个数字出现的次数
}
// 维持一个K大的小顶堆,比较器也是int[]类型
//int[] 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
PriorityQueue<int[]> queue = new PriorityQueue<int[]>((m , n) -> m[1] - n[1]);
for(Map.Entry<Integer, Integer> entry:occurrences.entrySet()){
int num = entry.getKey(),count = entry.getValue();
if(queue.size() == k){ //如果堆已满(大小>=k)且当前数的次数比堆顶大,用当前元素替换堆顶元素
if(queue.peek()[1]< count){
queue.poll();
queue.offer(new int[]{num, count});
}
}else{
queue.offer(new int[]{num, count});
}
}
int[] res = new int[k]; //返回堆中的数字部分
for(int i = 0; i<k; i++){
res[i] = queue.poll()[0];
}
return res;
}
}
注意:
(m , n) -> m[1] - n[1] 可以换为:
new Comparator<int[]>() {
public int compare(int[] m, int[] n) {
return m[1] - n[1]; //计数器判断cout大小,用作小顶堆
}
}
以上是关于Leetcode——前 K 个高频元素的主要内容,如果未能解决你的问题,请参考以下文章