X

LEETCODE 347. Top K Frequent Elements 解题思路分析

题目大意:

前 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

解题思路分析:

本题没有什么难度,思路大致如下:

  1. 先使用HashMap统计出每种元素出现的次数,key为数字,value为该数字出现次数
  2. 利用PriorityQueue对map中的数据进行排序,按照value降序排序
  3. 取出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-解题思路分析/
Categories: leetcode
kwantong: