LeetCode热题100-73题、前K个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
// 1. 统计频率
Map<Integer,Integer> frequencyMap = new HashMap<>();
for(int num : nums) {
frequencyMap.put(num,frequencyMap.getOrDefault(num,0) + 1);
}
// 2. 创建最小堆,定义比较规则为元素的频率
PriorityQueue<Integer> minHeap = new PriorityQueue<>(
(a,b) -> frequencyMap.get(a) - frequencyMap.get(b)
);
// 3. 遍历频率哈希表,用最小堆维护前k个高频元素
for (int num : frequencyMap.keySet()) {
if (minHeap.size() < k) {
minHeap.offer(num);
} else {
// 核心: 只有当当前元素的频率高于堆顶元素的频率时,才替换
if (frequencyMap.get(num) > frequencyMap.get(minHeap.peek())) {
minHeap.poll();
minHeap.offer(num);
}
}
}
// 4. 输出结果
int[] result = new int[k];
int index = 0;
while (!minHeap.isEmpty()) {
result[index++] = minHeap.poll();
}
return result;
}
}
|
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
浙公网安备 33010602011771号