数据结构——优先队列(priority_queue)的巧妙运用

优先队列是一种相对高级的数据结构,它的底层原理是二叉堆。然而本篇不会执着于深挖其背后的原理,更主要的是理一下它在题目中的一些实用方法,帮助你更快的上手使用。

优先队列(priority_queue)

        优先队列的特别之处就在于它可以自动进行排序,很好的维护了整个序列内的单调性,比如一个初始的大顶堆:priority_queue<int>.它自顶向下是呈递减的, 也就是说它的堆顶的元素永远都是最大的。这可以非常方便的处理有关序列单调性的问题。如果想实现最小堆这样定义:priority_queue<int, vector<int>, greater<int>>。接下来就说一下具体使用方法和场景。

优先队列常用函数
q.push(val)将值压进去
q.emplace(val)创造一个值压进去
q.pop()将堆顶值弹出去
q.size()整个堆的大小
q.empty()判断堆是否为空

先看一个经典的题目:703. 数据流中的第 K 大元素 - 力扣(LeetCode)

        题目非常的好懂,就是不停的增加序列的个数,每次输出第K大的数字。由于数字不停的在增加,如果每次都进行排序那么略显浪费。但是我们的优先队列只能读取第一个元素。要想解决快速找到第K个,不妨先定义一个最小堆,控制堆的大小为K,这样堆顶就一直是这K个中最小的了。思路上进行了一个小转变,可以O(1)查到第K大的数字,非常的便捷。

Code:

class KthLargest {
public:priority_queue<int, vector<int>, greater<int>> Q;int k1;KthLargest(int k, vector<int>& v) {k1 = k;for (int num : v)add(num);}int add(int val) {Q.push(val);if (Q.size() > k1)Q.pop();return Q.top();}
};

 通过上面的大概讲解可以了解到:优先队列只能得到此时堆顶的值,但如果我们想找中间值的话就成了麻烦。此时就要介绍一个优先队列的衍生用法:对顶堆

名字听起来好像是一个什么新的东西,但其实就是把一个优先队列根据题目要求给分成两个优先队列,把题目中要找的那个位置给露出来。接下来用一道例题简单解释一下。

题目:106. 动态中位数 - AcWing题库

题目解析:本题题意也非常的好理解,就是当本序列元素个数为奇数的时候输出此时的中位数。我们都知道,中位数一定要是有序的,所以用优先队列毋庸置疑。但是问题就在于中位数它必须是中间那个数,我们该怎么取呢? 诶,这个时候我们的对顶堆就派上了用场:用一个最小堆维护前一半的序列,再用一个最大堆维护后面那一半。这样就把中位数露出来了。

直接看代码吧,注释写的相对详细:

// Problem: 动态中位数
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/108/
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second 
#define endl '\n'
const int N = 1e6+5;
//1、多实例清变量!!!
//2、N范围变了没?
//3、是否开多实例?
//4、用字符串如果是两位数呢?
//5、没输入完不要退出!
priority_queue<int, vector<int>, greater<int>> Q;
priority_queue<int> q;
int n,m;
int a[N];
int x;
void solve()
{Q = priority_queue<int, vector<int>, greater<int>>();q = priority_queue<int>();vector<int> v;cin >> n >> m;cin >> x,q.push(x);v.push_back(q.top());//先将第一个数压进去for(int i=2; i<=m; i++){cin >> x;Q.push(x);//其实随便压一个就好了while(q.top()>Q.top())//保证Q整体是>=q的{int t=Q.top();Q.pop();Q.push(q.top());q.pop();q.push(t);}while(Q.size()>q.size())//调整大小,让q的大小始终比Q多一个{q.push(Q.top());Q.pop();}while(q.size()>Q.size()+1){Q.push(q.top());q.pop();}if(i%2==1)//当为奇数个的时候输出v.push_back(q.top());}cout << n << ' ' << m/2+1 << endl;int sum=0;for(auto i:v){cout << i << ' ';sum++;if(sum==10)//调整格式,保证一行最多10个{cout << endl;sum=0;}}if(sum!=0)cout << endl;v.clear();//清变量~
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;cin >> t;while(t--) solve();return 0;
}

总得来说,优先队列由于其自动排序的特点使得它非常的好用,一般可以在O(n)~O(nlogn)之间解决问题。还有几道相关的题可以练习一下:

  • 264. 丑数 II - 力扣(LeetCode)
  • P1090 [NOIP 2004 提高组] 合并果子 - 洛谷
  • 506. 相对名次 - 力扣(LeetCode)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java:继承和多态(必会知识点整理)

主要内容继承多态向上转型向下转型方法重写方法重载super关键字动态绑定封装访问控制构造方法规则一、继承 1. 概念&#xff1a; 一句话说就是&#xff1a;“共性抽取&#xff0c;代码复用”子类会将父类中的成员变量或者成员方法继承到子类中子类继承父类之后&#xff0c;必须…

基于esp32系列的开源无线dap-link项目使用介绍

基于esp32系列的开源无线dap-link项目使用介绍&#x1f516;有关esp32/8266相关项目&#xff1a;需要自己搭建编译环境&#xff1a; https://github.com/windowsair/wireless-esp8266-dap/tree/master&#x1f33f;支持esp32/c3/s3,支持在线固件烧录&#xff0c;支持AP配网&…

深入了解linux系统—— 进程信号的产生

前言 进程在收到信号之后&#xff0c;可以立即处理&#xff0c;也可以在合适的时间再处理&#xff08;1-31号普通信号可以不被立即处理&#xff09; 信号不是被立即处理&#xff0c;信号就要被保存下来&#xff0c;让进程在合适的时间再去处理。 相关概念 在了解进程是如何保存…

【Bluedroid】蓝牙协议栈enable流程深度解析

本文详细剖析 Bluedroid 蓝牙功能启用的核心流程&#xff0c;从enable()函数触发开始&#xff0c;深入解析蓝牙协议栈的异步启动机制、核心协议模块初始化、硬件控制器绑定及状态同步全流程。重点阐述接口就绪性检查、异步线程管理、配置文件回调机制等关键环节&#xff0c;揭示…

各种开发语言主要语法对比

各类主流编程语言的语法有着显著差异&#xff0c;这些差异源于语言设计哲学&#xff08;简洁性 vs 显式性&#xff09;、应用领域&#xff08;系统级、Web、数据科学&#xff09;、运行方式&#xff08;编译 vs 解释&#xff09;以及支持的范式&#xff08;面向对象、函数式、过…

小鹏汽车6月交付车辆34,611辆,同比增长224%

小鹏汽车-W(09868)发布公告&#xff0c;2025年6月&#xff0c;小鹏汽车共交付智能电动汽车34,611辆&#xff0c;同比增长224%&#xff0c;这标志着小鹏汽车已连续第八个月交付量超过了30,000辆。2025年第二季度&#xff0c;小鹏汽车共交付103,181 辆智能电动车&#xff0c;创下…

深入理解观察者模式:构建松耦合的交互系统

在软件开发中&#xff0c;我们经常遇到这样的场景&#xff1a;一个对象的状态变化需要通知其他多个对象&#xff0c;并且这些对象需要根据变化做出相应的反应。比如&#xff0c;用户界面中的数据变化需要实时反映到多个图表上&#xff0c;或者电商系统中的库存变化需要通知订单…

React强大且灵活hooks库——ahooks入门实践之常用场景hook

什么是 ahooks&#xff1f; ahooks 是一个 React Hooks 库&#xff0c;提供了大量实用的自定义 hooks&#xff0c;帮助开发者更高效地构建 React 应用。其中场景类 hooks 是 ahooks 的一个重要分类&#xff0c;专门针对特定业务场景提供解决方案。 安装 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget&#xff08;一&#xff09;1.QWidget2.enabled属性2.geometry&#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Qt的学习】 &#x1f4dd;&#x1f4dd;本…

AIOT开发选型:行空板 K10 与 M10 适用场景与选型深度解析

前言 随着人工智能和物联网技术的飞速发展&#xff0c;越来越多的开发者、学生和爱好者投身于创意项目的构建。 在众多的开发板中&#xff0c;行空板 K10 和 M10 以其独特的优势脱颖而出。 本文旨在为读者提供一份详尽的行空板 K10 和 M10 对比分析&#xff0c;从适用场景、…

redis汇总笔记

语雀完整版&#xff1a; https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis笔记》 Redis 一般问题 Redis内存模型&#xff08;I/O多路模型&#xff09;多路复用IO如何解释 为什么Redis要使用单线…

STM32用PWM驱动步进电机

硬件介绍&#xff1a;连线&#xff1a;注意这里stp连的是pwm脉冲&#xff0c;dir连的是方向到时候代码pwm波形就是从这里来的&#xff0c;具体接线根据你的代码来注意要点&#xff1a;步进电机和舵机驱动是不一样的&#xff0c;它是根据步长来移动的&#xff0c;所以要开一个中…

力扣25.7.10每日一题——重新安排会议得到最多空余时间 II

Description 今天这道题和昨天类似&#xff0c;只是允许顺序变化。 Solution 把会议区间视作桌子&#xff0c;空余时间视作空位&#xff0c;我们要把一个桌子移到别的空位中。 初步想法是枚举桌子&#xff0c;找一个长度大于等于桌子长度的空位移过去。看上去&#xff0c;找…

IP报文分片与重组原理及实现分析

IP报文分片与重组原理及实现分析 引用&#xff1a; ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 当IP数据包大小超过MTU&#xff08;最大传输单元&#xff09;时&#xff0c;路由器/主机将其分割为多个片段传输&#xff0c;每个片段包含&…

[python]在drf中使用drf_spectacular

安装drf_spectacular 文档 pypi链接:https://pypi.org/project/drf-spectacular/ 文档链接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安装步骤 在环境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)

5.预训练模型跑分 回顾赛题 回顾赛题任务 挑战与难点&#xff1a; 标注数据少 ——> 半监督学习 or 数据增强 聚类分析噪点影响严重 回顾Baseline 问题&#xff1a; TF-IDF无法捕捉以下语义。聚类分析粗糙&#xff0c;未评估聚类质量。 提升方案&#xff1a; 分类任务…

SPSSPRO:数据分析市场SaaS挑战者的战略分析

目录 第一部分&#xff1a;执行摘要 第二部分&#xff1a;平台解构&#xff1a;产品、架构与用户体验 2.1 SaaS范式转移&#xff1a;架构与起源 2.2 功能能力&#xff1a;分析师的工具箱 2.3 “智能分析”的价值主张 第三部分&#xff1a;市场渗透与受众细分 3.1 目标用户…

低版本hive(1.2.1)UDF实现清除历史分区数据

目标&#xff1a;通过UDF实现对表历史数据清除 入参&#xff1a;表名、保留天数N 一、pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

C++中顶层const与底层const

在C中&#xff0c;const关键字用于定义常量&#xff0c;但它在指针和引用上下文中会产生两种不同的常量性&#xff1a;顶层const&#xff08;top-level const&#xff09;和底层const&#xff08;low-level const&#xff09;。理解它们的区别是避免编译错误和提高代码质量的关…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数生态质量评价

集成云端、桌面端等环境&#xff0c;结合遥感云计算、GIS空间分析&#xff0c;R语言统计分析的优势&#xff0c;以分析生态环境脆弱性的时空演变为主线。通过本课程的学习&#xff0c;您将掌握&#xff1a;第一&#xff0c;收集各类指标数据&#xff0c;构建的“生态压力度-生态…