算法笔记(十一)——优先级队列(堆)

文章目录

  • 最后一块石头的重量
  • 数据流中的第 K 大元素
  • 前K个高频单词
  • 数据流的中位数

优先级队列是一种特殊的队列,元素按照优先级从高到低(或从低到高)排列,高优先级的元素先出队,可以用 来实现

是一种二叉树的结构,有两种主要类型:最大堆和最小堆
下面附上之前写的两篇博客:
优先级队列(priority_queue)
数据结构堆(Heap)的实现

最后一块石头的重量

题目:最后一块石头的重量

在这里插入图片描述
思路

  • 创建一个大根堆priority_queue<int> pq;默认情况下是大根堆,将所以石头加入到堆中
  • 用一个循环处理,直至堆中元素剩余元素个数小于等于1
  • 依次取出堆顶元素x,y其中x >= y
  • x = y ,则pop掉两元素;
  • x > y,则pop掉两元素,之后将x - ypush进堆
  • 循环结束后,若剩一个元素,即为其重量;若堆为空,则返回0

C++代码

class Solution 
{
public:int lastStoneWeight(vector<int>& stones) {priority_queue<int> pq; for(auto e : stones) pq.push(e);while(pq.size() > 1) {int x = pq.top();pq.pop();int y = pq.top();pq.pop();if (x > y)pq.push(x - y);   }return pq.size() == 0 ? 0 : pq.top();  }
};

数据流中的第 K 大元素

题目:数据流中的第 K 大元素

在这里插入图片描述
思路

  • 经典topK问题
  • 创建一个大小为k的堆
  • 循环:依次进堆,判断堆的大小是否超过k

找的是第k大元素,维护一个大小为k的最小堆,保证堆中只有前 k大的元素

  • 将新元素加入最小堆中,然后检查堆的大小是否超过k,如果超过则弹出堆顶元素
    最终返回当前堆顶元素,即为第 k大的元素
  • add 操作后始终保持堆中的元素为前 K 大的元素
  • 而堆顶元素即为第k大的元素。

C++代码

class KthLargest 
{// 创建一个大小为 k 的小根堆priority_queue<int, vector<int>, greater<int>> heap;int _k;
public:KthLargest(int k, vector<int>& nums) {_k = k;for(int& x : nums){heap.push(x);if(heap.size() > k) heap.pop();}}int add(int val) {heap.push(val);if(heap.size() > _k) heap.pop();return heap.top();}
};/*** Your KthLargest object will be instantiated and called as such:* KthLargest* obj = new KthLargest(k, nums);* int param_1 = obj->add(val);*/

前K个高频单词

题目:前K个高频单词

在这里插入图片描述
思路

  • 经典topK问题
  • 创建一个大小为k的堆
  • 循环:依次进堆,判断堆的大小是否超过k

找出前k个出现次数最多的,所以整体我们建小堆
对比较函数按照要求实现,不能用库里的;
如果两个字符串出现频率相同,那么我们让两字符串中字典序较小的排在前面,否则我们让出现频率较高的排在前面
C++代码

class Solution 
{typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& x, const PSI& y){if(x.second == y.second) return x.first < y.first;else return x.second > y.second;}};
public:vector<string> topKFrequent(vector<string>& words, int k) {// 统计单词的频次unordered_map<string, int> hash;for(auto e:words) hash[e]++;// 创建一个大小为 k 的堆priority_queue<PSI, vector<PSI>, cmp> heap;for(auto&e:hash){heap.push(e);if(heap.size() > k) heap.pop();}// 答案vector<string> ret(k);for(int i = k - 1; i >= 0; i--){ret[i] = heap.top().first;heap.pop();}return ret;}
};

数据流的中位数

题目:数据流的中位数

在这里插入图片描述
思路

利用大小堆来维护数据流的中位数

  • 初始化两个优先队列
  • left 用于存放较小的一半元素(大根堆)
  • right 用于存放较大的一半元素(小根堆)
    在这里插入图片描述
  • 个数为偶数时,大根堆元素个数m等于小根堆元素个数n,即m = n
  • 个数为奇数时,大根堆left多放一个,即m = n + 1
  • x,y 分别为大根堆、小根堆堆顶元素

add()添加元素时,我们按照下述方法维护两个堆

  • m == n时,
    • num <= x || m == 0num直接进入left
    • num > x num先进入right堆,再将right堆定元素放入left
  • m == n + 1时,
    • num <= xnum直接进入left堆,再将left堆定元素放入堆right
    • num > x num直接进入right

C++代码

class MedianFinder 
{priority_queue<int> left;priority_queue<int, vector<int>, greater<int>> right;
public:MedianFinder() {}void addNum(int num) {if(left.size()  == right.size()){if(left.empty() || num <= left.top()) left.push(num);else{right.push(num);left.push(right.top());right.pop();}}else{if(num <= left.top()){left.push(num);right.push(left.top());left.pop();}else right.push(num);}}double findMedian() {if(left.size() == right.size()) return (left.top() + right.top()) / 2.0;return left.top();}
};/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder* obj = new MedianFinder();* obj->addNum(num);* double param_2 = obj->findMedian();*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555493.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Microsoft Edge 离线安装包制作或获取方法和下载地址分享

方法一&#xff1a;自制压缩包 进入目录 "C:\Program Files (x86)\Microsoft\Edge\Application" 或 "C:\Program Files (x86)\Microsoft\EdgeCore\Edge版本号"&#xff0c;将所有文件打包&#xff0c;再放到没有安装到 Edge 的电脑里解压&#xff0c;运行…

【瑞昱RTL8763E】歌曲传输

1 概要 Watch 端 SD 卡中的歌曲除了可以通过 USB 传输&#xff0c;还可以通过 SPP/BLE 传输来完成歌曲的添加与删 除操作。其中&#xff0c;Android 手机可以安装 LocalPlayback.apk 使用 SPP 协议与 watch 交互&#xff1b;iOS 手机可以安装 LocalPlayback.ipa 通过 BLE 与 wa…

【高等数学学习记录】函数的极限

一、知识点 &#xff08;一&#xff09;知识结构 #mermaid-svg-Dz0Ns0FflWSBWY50 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Dz0Ns0FflWSBWY50 .error-icon{fill:#552222;}#mermaid-svg-Dz0Ns0FflWSBWY50 .erro…

计算有向无环图中两节点间简单路径的数量

计算有向无环图中两节点间简单路径的数量 主要步骤:伪代码:C代码实现:解释:在给定一个有向无环图(DAG)以及两个节点s和t时,我们需要计算从节点s到节点t之间的简单路径的数量。为了实现这一目标,我们可以使用动态规划的思想,在拓扑排序的基础上解决问题。 主要步骤: 拓…

Spring cloud 中gateway原理

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个 API 网关解决方案&#xff0c;用于在微服务架构中处理请求路由、负载均衡、认证授权、监控等功能。它基于 Spring 5、Spring Boot 2 和 Project Reactor&#xff0c;提供了非阻塞的、响应式的 API 网关功能。 核心概念…

论文翻译 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust

摘要 近年来&#xff0c;NLP从业者集中于以下实践:(i)导入现成的预训练(掩码)语言模型;(ii)在CLS令牌的隐藏表示(随机初始化权重)上附加多层感知器;(iii)在下游任务(MLP-FT)上微调整个模型。这一过程在标准的NLP基准上产生了巨大的收益&#xff0c;但这些模型仍然很脆弱&#x…

VCSEL驱动电路

1.1 驱动电路 发射端可用MOS管控制VCSEL二极管负极方式发出脉冲光(正极对地)&#xff0c;具体作用过程如下&#xff1a; Step 1: MOS管断开, C2 电容充电(左侧HV)&#xff1b; Step 2: 信号控制MOS管打开&#xff1b; Step 3: MOS管打开后, C2电容左侧电压降为0V, 右侧变为…

CF2013E Prefix GCD

【题目大意】 给定一个长度为 n n n 的数列 a 1 … n a_{1 \dots n} a1…n​&#xff0c;你可以将 a 1 … n a_{1 \dots n} a1…n​ 按照任意顺序进行重排&#xff0c;使得&#xff1a; ∑ i 1 n gcd ⁡ { a 1 , a 2 , a 3 , … , a n } \sum\limits_{i1}^{n}\gcd\left \{…

如何向文科生解释什么是计算机的缓存

缓存&#xff08;Cache&#xff09;是计算机系统中的一个至关重要的技术概念&#xff0c;用于提高数据访问的速度。我们可以把缓存想象成一个临时的存储区域&#xff0c;它存放着系统中常用或最近使用的数据&#xff0c;以便快速访问&#xff0c;而不必每次都从速度较慢的原始数…

新编英语语法教程

新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…

拒绝踏空和卖飞,魔改CCI指标主升浪战法!

〇、写在前边 其实最应该学习量化的&#xff0c;就是散户。 作为散户&#xff0c;我们能获取的只有公开信息&#xff0c;这使得我们天然就落后于机构、大户和内幕狗。 那么我们可以利用公开信息来提升投资表现吗&#xff1f;当然可以。 网上有大量免费或者低成本就能获取的…

野火STM32F103VET6指南者开发板入门笔记:【1】点亮RGB(基于结构体)

文章目录 硬件介绍软件介绍&#xff1a;结构体方式软件介绍&#xff1a;宏定义方式 硬件介绍 提示&#xff1a;本文是基于野火STM32F103指南者开发板所写例程&#xff0c;其他开发板请自行移植到自己的工程项目当中即可。 RGB-LEDPin引脚&#xff1a;低电平-点亮&#xff0c;高…

表达式求值(可以计算两位数以上)

此程序可计算两位数以上的表达式 import java.util.Stack;public class ExpressionEvaluator {public int evaluate(String s) {Stack<Integer> numbers new Stack<>();Stack<Character> operators new Stack<>();int i 0;char c s.charAt(i);whil…

灵足时代:具身智能核心部件的新秀崛起——解析数千万元天使轮融资

在智能科技日新月异的今天,具身智能作为连接物理世界与数字世界的重要桥梁,正逐步成为科技创新的前沿阵地。近日,具身智能核心部件领域的新锐公司——“灵足时代”宣布完成数千万元天使轮融资,这一消息无疑为行业内外带来了强烈的震撼与期待。本轮融资由雅瑞智友科学家基金…

在 MySQL 中处理和优化大型报告查询经验分享

在 MySQL 数据库的使用过程中&#xff0c;我们经常会遇到需要生成大型报告的情况&#xff0c;这些查询可能涉及大量的数据和复杂的计算&#xff0c;对数据库的性能提出了很高的要求。 一、问题背景 大型报告查询通常具有以下特点&#xff1a; 数据量大&#xff1a;涉及大量的…

【2024年最新】基于Spring Boot+vue的旅游管理系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

用js和css实现一行一行文字交替显示

用js和css实现&#xff0c;效果是&#xff1a;有多行文字&#xff0c;一行一行的交替显示&#xff0c;每隔几秒显示一行&#xff0c;循环显示。 代码如下&#xff0c;保存为html即可看到效果&#xff1a; <!DOCTYPE html> <html lang"en"> <hea…

数据库软题6.1-关系模式-关系模式的各种键

关系模式的各种键 题1-由关系模式求候选键 1. 候选键唯一不冗余 对选项进行闭包运算&#xff0c;如果得到全部属性U&#xff0c;则为候选码 A:AC-ABC-ABCD B:AB-ABC-ABCD C:AE-ABE-ABCE -ABCDE-ABCDEH D:DE2. R的候选码可以从A1,A2,A3,A1A2,A1A3,A2A3,A1A2A3中选择&#xff…

JC2804快速入门

目录 一、硬件接线二、软件操作2.1、CAN分析仪2.2、默认参数2.3、读取校准参数2.4、闭环控制2.5、调整PI参数2.6、切换控制模式 三、其它CAN模块操作3.1、使用CANable3.2、发送指令3.3、其它 一、硬件接线 红色接电源正极&#xff0c;黑色接电源负极&#xff0c;电源电压7—12V…

每日一道算法题——二分查找

文章目录 开口闭口区分:1、问题2、示例3、解决方法&#xff08;1&#xff09;注意点&#xff08;2&#xff09;代码 开口闭口区分: 开口闭口区分: [1,2,3] 左闭右闭[1,2,3) 左闭右开(1,2,3] 左开右闭 开口如数组(1,2,3)不包含当前数据&#xff0c;也就是指只有2&#xff0c;闭口…