leetcode 优先队列

leetcode347 前k个高频元素

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

在外设置比较器,定义自己的比较方法,然后传给PriorityQueue

 private class Freq {
        public int e,freq;
        
        public Freq(int e,int freq){ //构造函数
            this.e=e;
            this.freq=freq;
        }
        
        
      // public int compareTo(Freq another){
      //       if(this.freq<another.freq)
      //           return -1;
      //       else if(this.freq > another.freq)
      //           return 1;
      //       else
      //           return 0;
      //   }
       
    }
    
    
    private class FreqComparator implements Comparator<Freq>{//实现接口
        public int compare(Freq a,Freq b){
            return a.freq - b.freq; //逻辑和上面的一样 谁的频率小让谁靠前
        }    
    }
    
    public List<Integer> topKFrequent(int[] nums, int k) {
        
        TreeMap<Integer,Integer> map=new TreeMap<>();
        for(int num:nums){ 
            if(map.containsKey(num))
                map.put(num,map.get(num)+1);
            else
                map.put(num,1); //这样map中就包含了每个元素和每个元素出现的频次
        }
        
        PriorityQueue<Freq> pq = new PriorityQueue<>(new FreqComparator());
        for(int key:map.keySet()){//用优先队列求出前k个元素
            if(pq.size()<k)
                pq.add(new Freq(key,map.get(key)));
            else if(map.get(key)>pq.peek().freq){
                pq.remove();
                pq.add(new Freq(key,map.get(key)));
                
            }
        }
        LinkedList<Integer> res = new LinkedList<>();
        while(!pq.isEmpty())
            res.add(pq.remove().e);
        return res;
        
    }

以上专门给比较器做了一个类,用匿名类改变java内置的类型

  PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
            public int compare(Integer a, Integer b){
               return map.get(a) - map.get(b);  //看的是a对应的频率和b对应频率的大小
            }

java8以上内部类已经改变书写格式

 PriorityQueue<Integer> pq = new PriorityQueue<>(
            (a,b)->map.get(a)-map.get(b)
);

最后的代码简化为

class Solution {
    
//     private class Freq {
//         public int e,freq;
        
//         public Freq(int e,int freq){ //构造函数
//             this.e=e;
//             this.freq=freq;
//         }
        
        
      // public int compareTo(Freq another){
      //       if(this.freq<another.freq)
      //           return -1;
      //       else if(this.freq > another.freq)
      //           return 1;
      //       else
      //           return 0;
      //   }
       
   // }
    
    
    // private class FreqComparator implements Comparator<Freq>{//实现接口
    //     public int compare(Freq a,Freq b){
    //         return a.freq - b.freq; //逻辑和上面的一样 谁的频率小让谁靠前
    //     }    
    // }
    
    public List<Integer> topKFrequent(int[] nums, int k) {
        
        TreeMap<Integer,Integer> map=new TreeMap<>();
        for(int num:nums){ 
            if(map.containsKey(num))
                map.put(num,map.get(num)+1);
            else
                map.put(num,1); //这样map中就包含了每个元素和每个元素出现的频次
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>(
            (a,b)->map.get(a)-map.get(b)
        );
        
        for(int key:map.keySet()){//用优先队列求出前k个元素
            if(pq.size()<k)
                pq.add(key);
            else if(map.get(key)>map.get(pq.peek())){
                pq.remove();
                pq.add(key);
                
            }
        }
        
        LinkedList<Integer> res = new LinkedList<>();
        while(!pq.isEmpty())
            res.add(pq.remove());
        return res;  
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值