当前位置: 首页 > news >正文

算法奇妙屋(十二)-优先级队列(堆)

文章目录

  • 一. 力扣 [1046. 最后一块石头的重量](https://leetcode.cn/problems/last-stone-weight/description/)
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 二. 力扣 [703. 数据流中的第 K 大元素](https://leetcode.cn/problems/kth-largest-element-in-a-stream/description/)
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 三. 力扣 [692. 前K个高频单词](https://leetcode.cn/problems/top-k-frequent-words/description/)
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 四. 力扣 [295. 数据流的中位数](https://leetcode.cn/problems/find-median-from-data-stream/description/)
    • 1. 题目
    • 2. 算法原理
    • 3. 代码

一. 力扣 1046. 最后一块石头的重量

1. 题目

在这里插入图片描述

2. 算法原理

这道题的算法原理十分简单, 直接建立大根堆即可, 这里简单梳理下
在这里插入图片描述

3. 代码

    public int lastStoneWeight(int[] stones) {PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) -> b - a);for (int x : stones) {queue.offer(x);}while (queue.size() > 1) {int max1 = queue.poll();int max2 = queue.poll();if (max1 > max2) {queue.offer(max1 - max2);}}if (!queue.isEmpty()) {return queue.poll();}else {return 0;}}

二. 力扣 703. 数据流中的第 K 大元素

1. 题目

题目意思简单易懂, 这里不过多赘述, 直接看图即可
在这里插入图片描述

2. 算法原理

这道题有点绕口, 这里我们在初始化类的时候先求出来topk, 然后在后台调用add方法的时候, 只需要重复求topk流程即可, 下面图片解析的是求topk问题时,应该建立哪种类型的堆, 为什么要建这种堆?
在这里插入图片描述

3. 代码

    PriorityQueue<Integer> q;int t_k;public KthLargest(int k, int[] nums) {q = new PriorityQueue<>();t_k = k;for (int x : nums) {q.offer(x);if (q.size() > t_k) {q.poll();}}}public int add(int val) {q.offer(val);if (q.size() > t_k) {q.poll();}return q.peek();}

三. 力扣 692. 前K个高频单词

1. 题目

在这里插入图片描述

2. 算法原理

这道题原理不难, 难的是如何将代码实现, 注意掌握Pair的特性
在这里插入图片描述

3. 代码

    public List<String> topKFrequent(String[] words, int k) {Map<String, Integer> hash = new HashMap<>();for (String s : words) {hash.put(s, hash.getOrDefault(s, 0) + 1);}PriorityQueue<Pair<String, Integer>> q = new PriorityQueue<>((a, b) -> {if (a.getValue().equals(b.getValue())) {return b.getKey().compareTo(a.getKey());}else {return a.getValue() - b.getValue();}});for (Map.Entry<String, Integer> e : hash.entrySet()) {q.offer(new Pair<>(e.getKey(), e.getValue()));if (q.size() > k) {q.poll();}}List<String> ret = new ArrayList<>();while (!q.isEmpty()) {ret.add(q.poll().getKey());}Collections.reverse(ret);return ret;}

四. 力扣 295. 数据流的中位数

1. 题目

题目就是让求中位数, 最后结果需要注意是double类型
在这里插入图片描述

2. 算法原理

(1) 我们这里采用大小堆的解法, 下面我们来解释什么是大小堆
在这里插入图片描述
(2)一些细节问题, 例如如何入堆?如何维护顺序排列的数据流?
在这里插入图片描述

3. 代码

    PriorityQueue<Integer> left;PriorityQueue<Integer> right;public MedianFinder() {left = new PriorityQueue<>((a, b) -> b - a);right = new PriorityQueue<>();}public void addNum(int num) {int m = left.size();int n = right.size();Integer x = left.peek();if (m == n) {if (x == null) {left.offer(num);} else if (num <= x) {left.offer(num);} else {right.offer(num);left.offer(right.poll());}} else {if (num <= x) {left.offer(num);x = left.poll();right.offer(x);}else {right.offer(num);}}}public double findMedian() {if (left.size() == right.size()) {return (left.peek() + right.peek()) / 2.0;}else {return left.peek();}}
http://www.dtcms.com/a/619310.html

相关文章:

  • 东营北京网站建设抚州市网站建设
  • Redis_13_持久化(2)
  • 如何用文件传输协议登陆网站北京做网站公司排名浩森宇特
  • 数学分析简明教程——4.3
  • 技术支持 金华网站建设青羊网站建设
  • 科技广告公司网站模板电商设计接单
  • 作业333333
  • 【复习408】操作系统存储器管理浅析
  • seata的JacksonUndoLogParser回滚SerialArray类型的序列化和反序列化解析
  • 在线做初中题网站网站设计昆明
  • Python中lambda函数与def函数的区别及应用场景
  • 找工作的一些感悟——前端小菜的成长
  • 注册好了域名怎么开始做网站网站建设 网站推广
  • 晋江企业网站建设在深圳注册一个公司需要多少钱
  • “开源AI智能名片链动2+1模式S2B2C商城小程序”在县级市场的应用与挑战分析
  • 大气网站案例网站制作公司备案
  • 16.触摸屏驱动
  • Q7: 在区块链上创建随机数有哪些挑战?
  • 宿城网站建设大连市网站制作电话
  • 做a视频网站有哪些系统优化的目的和意义
  • 网站开发外快如何优化网站打开速度
  • 城市配送联盟平台技术架构深度解析:赋能小 B 端全场景高效配送
  • 公司网站定制自己做网页怎么赚钱
  • 济南网站建设公司按需定制wordpress赞 踩插件
  • 建外贸网站的wordpress源码书籍
  • 织梦网站源码找一品资源企业网站建设费怎么账务处理
  • 如何在国外建设网站百度站长平台验证网站
  • 考研408--组成原理--day3--数字电路(补)加减乘除
  • 深圳企业网站建设推广服务wordpress extra script
  • Python的自述