LeetCode347. 前 K 个高频元素

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        //先统计每个数字出现的频率
        
        
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length ; i++)
        {
            if(map.containsKey(nums[i]))
            {
                map.put(nums[i], map.get(nums[i]) + 1);
            }
            else
            {
                map.put(nums[i] , 1);
            }
        }


        //根据出现的次数构造小顶堆,把次数少的放在堆顶
        PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>()
        {
            public int compare(Integer a, Integer b)
            {
                return map.get(a) - map.get(b);
            }
        });

        for(int key : map.keySet())
        {
            if(pq.size() < k)
            {
                pq.add(key);
            }
            else if(map.get(key) > map.get(pq.peek()))
            {
                pq.remove();//直接删除,因为只需要K个
                pq.add(key);
            }
        }
        List<Integer> res = new ArrayList<>();
        while (!pq.isEmpty())
        {
            res.add(pq.remove());
        }
        return res;

    }
}

 

posted @ 2020-05-12 20:37  贼心~不死  阅读(131)  评论(0编辑  收藏  举报