题目大意:
前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=347
解题思路分析:
本题没有什么难度,思路大致如下:
- 先使用HashMap统计出每种元素出现的次数,key为数字,value为该数字出现次数
- 利用PriorityQueue对map中的数据进行排序,按照value降序排序
- 取出Queue中前k个元素
实现代码:
public List<Integer> topKFrequent(int[] nums, int k) { // 统计数组中每个数字出现次数 Map<Integer, Integer> map = new HashMap<>(); for(int n : nums){ int count=map.getOrDefault(n,0)+1; map.put(n,count); } // 将map中的数据按照value(出现次数)降序排序 PriorityQueue<Map.Entry<Integer,Integer>> q= new PriorityQueue<>((a,b)->b.getValue()-a.getValue()); for(Map.Entry<Integer,Integer> e : map.entrySet()){ q.offer(e); } // 取得Queue中前k个元素 List<Integer> res = new ArrayList<>(); for(int i=0;i<k;i++){ res.add(q.poll().getKey()); } return res; }
本题解法执行时间为10ms。
Runtime: 10 ms, faster than 96.44% of Java online submissions for Top K Frequent Elements.
Memory Usage: 42.6 MB, less than 7.76% of Java online submissions for Top K Frequent Elements.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-347-top-k-frequent-elements-解题思路分析/