347. 前 K 个高频元素
public class topK {
//// 第一种方法,需要对所有的数据进行排序 时间复杂度n*logn
// public static int[] topKFrequent(int[] nums, int k) {
// HashMap<Integer, Integer> hashMap = new HashMap<>();
//
// for (int i = 0; i < nums.length; i++) {
// hashMap.put(nums[i],hashMap.getOrDefault(nums[i],0)+1);
// }
//
// Set<Map.Entry<Integer, Integer>> entries = hashMap.entrySet();
// ArrayList<Map.Entry<Integer, Integer>> list = new ArrayList<>(entries);
//
// list.sort(new Comparator<Map.Entry<Integer, Integer>>() {
// @Override
// public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
// return o2.getValue()-o1.getValue();
// }
// });
//
// int[] result = new int[k];
// for (int i = 0; i < k; i++) {
// result[i] = list.get(i).getKey();
// }
// return result;
// }
// 维护一个长度为k优先队列,每次只排序k个数 时间复杂度是n*logk
// 小顶堆实现,过程是每次加进来一个新值,和当前K个值做比较,把最小的运送到堆顶,并弹出。(主要求前K大的数要把大的留下,
// 小的弹走,留下的就是topK)
public static int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
hashMap.put(nums[i],hashMap.getOrDefault(nums[i],0)+1);
}
// 后元素减前面
Comparator<Map.Entry<Integer, Integer>> comparator = new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue()-o1.getValue();
}
};
PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>(comparator);
for(Map.Entry<Integer, Integer> entry:hashMap.entrySet()){
queue.add(entry);
}
int[] ans = new int[k];
for (int i = 0; i < k; i++) {
ans[i] = queue.poll().getKey();
}
return ans;
}
public static void main(String[] args) {
int[] nums = {1,1,1,2,2,3};
int k = 2;
int[] frequent = topKFrequent(nums, k);
for (int i = 0; i < frequent.length; i++) {
System.out.println(frequent[i]);
}
}
}
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)