數據結構——優先隊列(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
英文地址,請注明出處:http://en.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;構建的“生態壓力度-生態…