【刷题1】LeetCode 347. 前 K 个高频元素 java题解

题目

347. 前 K 个高频元素

在这里插入图片描述

方法:堆

分析

1.用HashMap记录数字和它们出现的次序。
2.创建一个小顶的,容量为k的优先队列。将map中的元素依次加入优先队列。
如果优先队列大小<k,直接加入;
如果优先队列大小>=k,比较堆顶.value和当前.value。如果堆顶.value小,则删除堆顶,再插入当前元素。否则,舍弃当前元素。
3.将优先队列k个元素加入结果返回。

代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        if(nums==null||nums.length==0||k==0)
            return new int[0];
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int n:nums){
            if(!map.containsKey(n)){
                map.put(n,1);
            }
            else{
                map.put(n,1+map.get(n));
            }
        }
        PriorityQueue<Map.Entry<Integer, Integer>> queue=new PriorityQueue<Map.Entry<Integer, Integer>>(map.size(),new Comparator< Map.Entry<Integer, Integer> >(){
            public int compare(Map.Entry<Integer, Integer> i1,Map.Entry<Integer, Integer> i2){
                return i1.getValue()-i2.getValue();
            }
        });
        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
	       if(queue.size()<k){
               queue.add(entry);
           }
           else{
               if(queue.peek().getValue()<entry.getValue()){
                   queue.poll();
                   queue.add(entry);
               }
           }
        }
        int[] res=new int[k];
        for(int i=0;i<k;i++){
            res[i]=queue.poll().getKey();
        }
        return res;
    }
}

复杂度

时间复杂度:O(Nlogk),其中 N 为数组的长度。我们首先遍历原数组,并使用哈希表记录出现次数,每个元素需要 O(1) 的时间,共需 O(N)的时间。随后,我们遍历「出现次数数组」,由于堆的大小至多为 k,因此每次堆操作需要 O(logk) 的时间,共需 O(Nlogk) 的时间。二者之和为O(Nlogk)。
空间复杂度:O(N))。哈希表的大小为O(N),而堆的大小为 O(k),共计为O(N)。

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值