给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路:先遍历一遍数组,用Hash Map记录每个数出现的次数,然后建一个小根堆存储数组,数组包含数和出现次数,按出现次数排序。当堆满k时进行判断,若堆顶元素小于当前数的次数,则移除堆顶元素,加入新的元素。最后新建数组添加答案。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();
for(int num : nums){
map.put(num, map.getOrDefault(num,0) + 1);
}
PriorityQueue<int[]> queue = new PriorityQueue<>((a,b) -> (a[1] - b[1]));
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
Integer key = entry.getKey();
Integer value = entry.getValue();
if(queue.size() == k){
if(queue.peek()[1] < value){
queue.remove();
queue.offer(new int[]{key, value});
}
}else {
queue.offer(new int[]{key, value});
}
}
int[] ret = new int[k];
for (int i = 0; i < k; i++) {
ret[i] = queue.remove()[0];
}
return ret;
}
}
Comments NOTHING