347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/top-k-frequent-elements/首先要用Map统计出现次数,然后把Map的Entry依次加入小顶堆(用PriorityQueue实现)。
为什么用小顶堆而不是大顶堆:小顶堆方便把出现次数最少的元素移除,保持堆的大小不超过k,这样时间复杂度会小于O(nlogn)。如果不及时移除,就相当于做了一次完整的堆排序,时间复杂度就是O(nlogn)。
最后把堆内k个Entry的Key放进数组就好了。
class Solution {
public static int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
map.put(n, map.getOrDefault(n, 0) + 1);
}
Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue()-o2.getValue());//小顶堆
for (Map.Entry entry:entries){
queue.offer(entry);
if (queue.size()>k)//只保留当前出现最多的前k个,否则就相当于在做堆排序
queue.poll();
}
int [] res = new int[k];
for (int i=0;i<k;i++){
res[i] = queue.poll().getKey();
}
return res;
}
}