JAVA练习348- 前 K 个高频元素 题目概览给你一个整数数组nums和一个整数k请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。示例 1输入nums [1,1,1,2,2,3], k 2输出[1,2]示例 2输入nums [1], k 1输出[1]示例 3输入nums [1,2,1,2,1,2,3,1,3,2], k 2输出[1,2]提示1 nums.length 10^5-10^4 nums[i] 10^4k的取值范围是[1, 数组中不相同的元素的个数]题目数据保证答案唯一换句话说数组中前k个高频元素的集合是唯一的进阶你所设计算法的时间复杂度必须优于O(n log n)其中n是数组大小。来源347. 前 K 个高频元素 - 力扣LeetCode解题分析方法哈希 堆每个数字出现次数可以先遍历一次用哈希表存储。由于对出现次数进行排序的话时间复杂度会达到 nlogn因此我们可以用通过堆来实现通过实现一个最小堆堆顶只放出现次数最小的元素则当堆大小小于 k 时入堆当堆大小等于 k 时比较当前元素与堆顶元素大小若当前元素大则将栈顶元素出栈入当前元素否则忽略时间复杂度O(nlogk) ( k 为优先队列的大小空间复杂度O(nlogk)class Solution { public int[] topKFrequent(int[] nums, int k) { final MapInteger, Integer map new HashMap(); for (int num: nums) { map.put(num, map.getOrDefault(num, 0) 1); } PriorityQueueInteger pq new PriorityQueue(new ComparatorInteger() { public int compare(Integer a, Integer b) { return map.get(a) map.get(b) ? 1 : -1; } }); for (Integer key: map.keySet()) { if (pq.isEmpty() || pq.size() k) { pq.offer(key); continue; } if (map.get(pq.peek()) map.get(key)) { pq.poll(); pq.offer(key); } } int[] result new int[k]; int i 0; while(!pq.isEmpty()) { result[i] pq.poll(); } return result; } }
💡
读完这篇文章,你可以带走什么

本文来自编程新知一线开发与建站实战沉淀:讲清原理、给出可复现步骤、标注避坑要点。看完后可以直接在你的项目或网站中落地验证。

编程新知内容团队
一线开发 · 建站实施 · 持续更新
由资深前端工程师、后端架构师与建站实施人员共同维护,坚持"真实案例 + 完整步骤 + 避坑指南"的内容准则。如果你在落地中遇到问题,欢迎联系我们交流。

想把这套方案用到自己的项目上?

编程新知提供技术答疑与网站建设一站式服务,欢迎联系我们获取针对性建议。

联系工程师
📚

系统学习该技术

进入对应栏目,从基础到进阶完整学习,配套案例与避坑指南。

前往栏目 →
🏗️

需要落地实施

企业建站、SEO 优化、服务器部署等需求,交给工程师一步到位。

了解服务 →
💬

还有疑问

技术难题或方案咨询,联系编程新知获取一对一的专业建议。

联系我们 →