题目链接: 347.前K个高频元素
1.问题思路
① 求K个高频元素,首先统计素及对应出现次数,这里使用Map来统计。
② 声明小顶堆,遍历Map。需要维护堆大小,如果堆元素数量>k,则将顶元素跳出。
③ 创建一个int数组,用于记录堆中K个元素。
2.代码实现
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> paramMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
boolean flag = paramMap.containsKey(nums[i]);
if (flag) {
Integer count = paramMap.get(nums[i]);
paramMap.put(nums[i], count+1);
} else {
paramMap.put(nums[i], 1);
}
}
// 声明小顶堆
PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>(k, Comparator.comparingInt(Map.Entry::getValue));
Set<Map.Entry<Integer, Integer>> entries = paramMap.entrySet();
for (Map.Entry<Integer, Integer> entry : entries) {
queue.offer(entry);
if (queue.size() > k) {
queue.poll();
}
}
int[] result = new int[k];
for (int i = k-1; i >= 0 ; i--) {
result[i] = queue.poll().getKey();
}
return result;
}