6力扣题做题笔记及复盘--347.前 K 个高频元素(优先队列、map)
347. 前 K 个高频元素 - 力扣(LeetCode)
思路
这道题目主要涉及到如下三块内容:
- 要统计元素出现频率
- 对频率排序
- 找出前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);