一、目的

写本片博客的目的是为了让自己和大家了解优先队列的用法以及HashMap的两种遍历方式

二、首先讲解一下什么是优先队列

PriorityQueue保存队列元素的顺序不是它们加入队列的顺序,而是他们的大小(默认poll的顺序是从小到大)。所以使用peek()、poll()函数取出队列中的元素时,不是取出最先存进去的元素而是所有元素中最小的元素。
同时PriorityQueue不允许插入null元素,他存储的元素必须是可以比较的对象,否则要指明比较器。

PriorityQueue实现自定义比较器
PriorityQueue中的元素是从小到大顺序排列的,如果我希望里面的元素从大到小逆序排列可以这么写:

PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> (b - a));

假设我PriorityQueue中的元素是数组,我希望队列中的数组按照第二位数的值从小到大顺序排列,可以这么定义:

PriorityQueue<Integer>  queue = new PriorityQueue<>((a, b) -> (a[1]-b[1]));

三、题目描述

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:

输入: nums = [1], k = 1
输出: [1]

四、代码书写

class Solution {public int[] topKFrequent(int[] nums, int k) {HashMap<Integer,Integer> hashMap = new HashMap<>();for(int m : nums){hashMap.put(m,hashMap.getOrDefault(m,0)+1);}PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) -> (hashMap.get(b)-hashMap.get(a)));for(int key : hashMap.keySet()){queue.offer(key);}int res[] = new int[k];for(int i=0;i<k;i++){res[i] = queue.poll();}return res;}
}

PriorityQueue queue = new PriorityQueue<>((a,b) -> (hashMap.get(b)-hashMap.get(a)));
表示优先队列中存储的是hashMap中值按从大到小顺序排列的

五、方法二代码书写(主要是为了让大家学习第二种HashMap的遍历方式)

// 借助 HashMap 数据结构public int[] topKFrequent(int[] nums, int k) {int[] res = new int[k];    // 结果数组Map<Integer, Integer> map = new HashMap();// 统计数组中各元素出现的次数for(int num : nums){if(map.containsKey(num)){map.put(num, map.get(num) + 1);}else{map.put(num, 1);}}int maxTimes = 0;    // 出现最多的元素的出现次数// 找出出现次数最多的元素出现的次数for(Map.Entry<Integer, Integer> entry : map.entrySet()){if(entry.getValue() > maxTimes){maxTimes = entry.getValue();}}// 按出现次数从大到小添加到结果数组while(k > 0){for(Map.Entry<Integer, Integer> entry : map.entrySet()){if(entry.getValue() == maxTimes){res[k - 1] = entry.getKey();k--;}}maxTimes--;}return res;}

12.前K个高频元素---使用优先队列和哈希表解决相关推荐

  1. leetcode(力扣) 347. 前 K 个高频元素(优先队列 堆 哈希计数器)

    文章目录 题目描述 思路分析 法一( 哈希计数): 法二(堆): 完整代码 题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. ...

  2. 力扣347.前 K 个高频元素(优先队列)

    347. 前 K 个高频元素 本题的关键点是对map中的value进行排序. 题目中涉及前几个,考虑优先队列 优先队列要通过lamda表达式写清楚是大数在顶还是小数在顶 逆序: PriorityQue ...

  3. 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)

    [LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...

  4. 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素

    本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 今天分享的题目来源于 LeetCode 上第 347 号问题: ...

  5. 215.数组中的第K个最大元素/347. 前 K 个高频元素

    2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...

  6. 前K个高频元素[小根堆和大根堆的使用]

    小根堆 前言 一.前K个高频元素 二.小根堆&大根堆 1.O(KlogN)大根堆 2.O(NlogK)小根堆 总结 参考文献 前言 当题目需要有序性时,果断排序,可二分快速寻找答案,或是利用有 ...

  7. LeetCode——347. 前 K 个高频元素【最小堆实现】

    LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...

  8. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    更多 LeetCode 题解笔记可以访问我的 github. 文章目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java ...

  9. 【20230401】【每日一题】前K个高频元素

    给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 统计元素出现的频率 ---用map 对出现的频率进行排序---优先级队列 找出前K个 ...

最新文章

  1. 在Paddle中利用AlexNet测试CIFAR10数据集合
  2. bzoj 2653 middle (可持久化线段树)
  3. fiddler+android抓包工具配置使用
  4. 实践2.4 ELF文件格式分析
  5. 链接器工具错误 LNK2019 必须在友元声明中显式指定模板参数
  6. 客座编辑:石勇(1956-),男,中国科学院大学经济与管理学院教授、博士生导师,发展中国家科学院院士...
  7. pcl完整分割聚类流程
  8. sql批量删除和条件查询
  9. B. Forgery
  10. 删除Flex Builder中没用的工作空间
  11. 实现fashion_minst服装图像分类
  12. 上机7 java异常处理,JavaSE学习笔记(七)——java异常处理机制
  13. 【云和恩墨大讲堂】 陈顼 - 一次视图合并引起的性能问题
  14. 数据库中平凡函数和非平凡函数,完全函数依赖和部分函数
  15. java 模拟天眼查登陆,模拟天眼查登陆问题
  16. Ubuntu Desktop 22.04 LTS系统(树莓派4B)配置系统输入法
  17. “宅经济”催化下的泛娱乐行业,未来将引爆哪些增长点?
  18. 2021-2027全球与中国铝质气雾罐市场现状及未来发展趋势
  19. 配置一个好看的PowerShell
  20. 杭电oj(Java版)——1713 相遇周期

热门文章

  1. linux安装eclipse运行web,Linux安装Tomcat,运行Eclipse,web项目
  2. docker nginx部署前端项目
  3. bootstrap-datetimepicker时间控件添加清除按钮
  4. javascript的特点
  5. linux 线程库在哪里,linux线程库
  6. 终于把 7 年前的 Docker Hub 账号恢复了
  7. Galaxy 生信平台(四):邮件与管理员配置
  8. MPB:深大李猛组-基于PacBio SMRT三代测序的红树林沉积物真菌群落的研究
  9. KEGG功能注释工具 KofamKOALA 安装与使用
  10. Microbiome:应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系(一作解读)...