Leetcode347. 前 K 个高频元素

347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1L8https://leetcode-cn.com/problems/top-k-frequent-elements/首先要用Map统计出现次数,然后把Map的Entry依次加入小顶堆(用PriorityQueue实现)。

为什么用小顶堆而不是大顶堆:小顶堆方便把出现次数最少的元素移除,保持堆的大小不超过k,这样时间复杂度会小于O(nlogn)。如果不及时移除,就相当于做了一次完整的堆排序,时间复杂度就是O(nlogn)

最后把堆内kEntryKey放进数组就好了。

class Solution {
    public static int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int n : nums) {
            map.put(n, map.getOrDefault(n, 0) + 1);
        }
        Set<Map.Entry<Integer, Integer>> entries = map.entrySet();

        PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue()-o2.getValue());//小顶堆
        for (Map.Entry entry:entries){
            queue.offer(entry);
            if (queue.size()>k)//只保留当前出现最多的前k个,否则就相当于在做堆排序
                queue.poll();
        }

        int [] res = new int[k];
        for (int i=0;i<k;i++){
            res[i] = queue.poll().getKey();
        }
        return res;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值