347.前K个高频元素

题目描述

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

思路

  1. 这道题是标准的topK问题,需要建立一个小根堆。
  2. 可以先遍历一遍数组,使用一个map存储每个元素出现的次数。
  3. 使用java原生的优先级队列存放Entry,若size大于k,将队首元素出队即可。

Java代码实现

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> numMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            numMap.put(nums[i],numMap.getOrDefault(nums[i],0)+1);
        }

        PriorityQueue<Map.Entry<Integer,Integer>> priorityQueue = new PriorityQueue<>(k,(o1,o2)->(o1.getValue()-o2.getValue()));

        Set<Map.Entry<Integer, Integer>> entries = numMap.entrySet();

        for (Map.Entry<Integer,Integer> entry:entries) {
            priorityQueue.add(entry);
            if(priorityQueue.size()>k){
                priorityQueue.poll();
            }
        }

        List<Integer> res = new ArrayList<Integer>();
        for (int i = 0; i < k; i++) {
            res.add(priorityQueue.poll().getKey());
        }
        return res;
    }
}
全部评论

相关推荐

fRank1e:吓得我不敢去外包了,但是目前也只有外包这一个实习,我还要继续去吗
点赞 评论 收藏
分享
每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务