LeetCode——剑指 Offer II 060. 出现频率最高的 k 个数字
作者:互联网
出现频率最高的 k 个数字
题目
给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。
思路
先利用一个hashmap来统计各个数字的个数,然后,将这个哈希表转化为一个优先队列,根据计数数字的大小来作为优先级判断。最终,优先队列的前k个元素就是所要寻找的答案!
代码
import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.TreeMap;
// 自定义元素
class Element
{
int num;
int count;
public Element(int num,int count)
{
this.num=num;
this.count=count;
}
@Override
public String toString() {
return "Element{" +
"num=" + num +
", count=" + count +
'}';
}
}
// 自定义排序规则
class MyCmp implements Comparator<Element>
{
@Override
public int compare(Element o1, Element o2) {
return o2.count-o1.count;
}
}
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
PriorityQueue<Element> priorityQueue = new PriorityQueue<>(new MyCmp());
int length = nums.length;
// 利用一个哈希表来统计数字的个数
for(int i=0;i<length;++i)
{
if(!map.containsKey(nums[i]))
map.put(nums[i],1);
else
map.put(nums[i],map.get(nums[i])+1);
}
// 将哈希表转化为优先队列
for (Integer n: map.keySet())
{
priorityQueue.add(new Element(n,map.get(n)));
}
int ans[]=new int[k];
for (int i=0;i<k;++i)
{
ans[i]=priorityQueue.poll().num;
}
return ans;
}
}
结果
目前没有什么更优的想法!
标签:count,060,Offer,int,nums,Element,II,map,num 来源: https://blog.csdn.net/weixin_44750790/article/details/120157887