描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
分析
使用map集合统计每个数字的出现次数,利用小顶堆计算出前k大热频数字。
推荐代码一思路
代码一与代码二的区别在于,小顶堆存储的数据类型。
代码一存储的是map集合的key,代码二存储的是map集合的entry。比较器都是比较map的value。代码一至多一只需要存储map的key,得益于比较器。
代码一的数据类型是Integer,代码二存储的是Map.Entry<Integer,Integer>,书写困难,容易出错。
代码一利用了lambok特性,书写简单。
代码一
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i : nums){
if(map.containsKey(i)){
int tmp = map.get(i)+1;
map.put(i,tmp);
}else{
map.put(i,1);
}
}
PriorityQueue<Integer> heap = new PriorityQueue<>( (a,b)->(map.get(a) - map.get(b)));
for(Integer num : map.keySet()){
heap.add(num);
if(heap.size()>k){
heap.poll();
}
}
int[] res = new int[k];
for(int i = 0; i < k; i++){
res[i] = heap.poll();
}
return res;
}
}
代码二
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i : nums){
if(map.containsKey(i)){
int tmp = map.get(i)+1;
map.put(i,tmp);
}else{
map.put(i,1);
}
}
PriorityQueue<Map.Entry<Integer,Integer>> heap = new PriorityQueue<>(k,new Comparator<Map.Entry<Integer,Integer>>(){
public int compare(Map.Entry<Integer,Integer> m1, Map.Entry<Integer,Integer> m2){
return m1.getValue() - m2.getValue();
}
});
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
heap.add(entry);
if(heap.size() > k){
heap.poll();
}
}
int[] res = new int[k];
for(int i = 0; i < k; i++){
res[i] = heap.poll().getKey();
}
return res;
}
}