给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
跟一般的求最大值方法类似,唯一区别就是需要维护一个int数组,分别记录当前数和当前数字的次数,并建立一个小根堆,用次数跟小根堆顶进行比较,存放拥有最大的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<>(new Comparator<int[]>(){
public int compare(int[] m,int[] n){
return m[1] - n[1];
}
});
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
int num = entry.getKey();
int count = entry.getValue();
if(queue.size() == 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;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements