6力扣题做题笔记及复盘--347.前 K 个高频元素(优先队列、map)

347. 前 K 个高频元素 - 力扣(LeetCode)

思路

这道题目主要涉及到如下三块内容:

  1. 要统计元素出现频率
  2. 对频率排序
  3. 找出前K个高频元素

1、对元素出现的频率可以采用Map来统计

2、对频率排序可以用优先队列进行排序,优先队列的底层是小根堆或大根堆。PriorityQueue<> priorityQue = new PriorityQueue<>();

对队列进行添加统计的数据,优先队列会自动排序,这里有个学习的点,就是用map.entrySet(); Map的遍历优先队列和Map的整合应用

3、用数组存储队列元素即可。

代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int item:nums){
                if(map.containsKey(item)){
                     map.put(item,map.get(item)+1);
                }else{
                    map.put(item,1);
                }
        }
//利用map.entrySet()获得一个set集合,这个集合里是一个map,遍历的时候就是一个个map
        Set<Map.Entry<Integer,Integer>> set = map.entrySet();
//优先队列,优先队列的数据类型map,使用拉姆达表达式比较值
        PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>((o1,o2)->o1.getValue()-o2.getValue());
        for(Map.Entry<Integer,Integer> entry:set){
                queue.offer(entry);
                if(queue.size()>k){
                    queue.poll();
                }
        }

int[] res = new int[k];

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

总结

1、优先队列的使用,重点

2、对PriorityQueue的排序用法:

 

默认是自然顺序,即升序

 

方法一
设置成
降序: Queue<Integer> heap=new PriorityQueue<>((a, b) -> b.compareTo(a));/ Queue<Integer> heap=new PriorityQueue<>((a, b) -> b.-a)
b<a
升序: Queue<Integer> heap=new PriorityQueue<>((a, b) -> a.compareTo(b));/ Queue<Integer> heap=new PriorityQueue<>((a, b) -> a.-b);
a<b
3、对Map的遍历:Set<Map.Entry<Integer,Integer>> set= map.entrySet<>();把Map的键值对放在一个set集合中,然后对Set进行遍历获取每一个map Entry。

4、对Map进行统计:

是否存在某个元素,map.containsKey(item)

添加元素:map.put(key,value);

获取value:map.get(item);

 

posted @ 2022-05-23 15:09  jason饼干大怪兽  阅读(49)  评论(0)    收藏  举报