算法思想總結:優先級隊列

一、最后一塊石頭的重量

. - 力扣(LeetCode)

? ? ? ? 我們每次都要快速找到前兩個最大的石頭進行抵消,這個時候用優先級隊列(建大堆),不斷取堆頂元素是最好的!每次刪除堆頂元素后,可以自動調整,時間復雜度是logN。

class Solution {
public:int lastStoneWeight(vector<int>& stones) {//建立優先級隊列  大堆priority_queue<int> heap;for(auto&num:stones) heap.push(num);while(heap.size()>1){int x=heap.top();heap.pop();int y=heap.top();heap.pop();if(x>y) heap.push(x-y); }return heap.size()?heap.top():0;//不為空,就返回堆頂元素,為空,就返回0}
};

二、數據流中的第K大元素

. - 力扣(LeetCode)

(1)在學習分治專題的時候,我們知道topK問題可以用優先級隊列去解決也可以用快速排序的三路劃分去解決,并且快速排序反而會更優秀一點,那優先級隊列的優勢究竟體現在哪里呢??其優勢體現在可以不斷地去取用堆頂元素或者是加入元素的時候都可以通過用logN的時間復雜度進行調整,而前期建堆也僅僅是N*logN的時間復雜度,而快速排序的三路劃分則是一次性的N的時間復雜度,所以長期優先級隊列收益高,短期收益快速排序的三路劃分收益高。

class KthLargest {priority_queue<int,vector<int>,greater<int>> heap;//仿函數int k;   //創建一個大小為k的小根堆 堆頂始終是第k大的元素//用快速排序算法可以是O(N)的復雜度,但是如果是要頻繁去獲取,就很顯然得依靠優先級隊列
public:KthLargest(int _k, vector<int>& nums) {k=_k; for(auto &val:nums) {heap.push(val);if(heap.size()>k) heap.pop();//入堆的同時進行向上調整}}int add(int val) {heap.push(val);if(heap.size()>k)heap.pop();//可能我插入的時候堆里啥也沒有return heap.top();}
};

?三、數據的中位數

. - 力扣(LeetCode)

策略1:存在數組中用sort去排序? ——?add(NlogN)? find(1)?

策略2:還是存在數組中,利用插入排序的思想,因為插入之間就已經是有序的了,所以新元素插入時的時間復雜度是插入排序的最好情況O(N)? ?——add(N)? ?find(1)

策略3:優先級隊列大小堆維護中位數? ?add(logN)? find(1)

設計思路:

1、建立left為大根堆,right為小根堆

2、我們的add控制始終保持left的數量要么和right相等,要么比right多一個,為了能夠滿足在O(1)的復雜度內完成找到中位數的任務,我們希望當left多一個的時候,left堆頂的元素就是中位數,而當left和right相等的時候,中位數就是兩個堆的堆頂元素的平均值。

3、為了達到這個目的,我們在時刻控制left和right的數量的同時,一定要保證left里面的元素是小于等于right里面的元素的,所以add要分兩種情況去討論:

情況1:當兩個堆的元素個數相等的時候

? ? (1)如果left為空,或者是add的元素比left的堆頂元素小,那么就讓該元素直接進left

? ? (2)如果add的元素比left的堆頂元素大,那么他也有可能會比right的元素大,所以我們必須要將這個元素丟到right中,但是直接丟就會破壞規則,所以我們要先將add的元素丟到right中進行調整,然后再將right的堆頂元素丟到left中去,保持left和right的數量關系。 (注意,這里的先后順序很重要,我們不能先將right的堆頂元素丟到left中,然后再將add丟到right中進行調整,因為我們只是知道這個數比left的堆頂元素大,但是他是比right的堆頂元素大還是小我們不得而知,必須要通過他自己的向下調整去選出來)

情況2:當left的元素比right多一個的時候

? (1)如果add的元素比left的堆頂元素大,這個時候無腦進右邊就行了。

? ?(2)如果add的元素比left的堆頂元素小,這個時候我們也得把add的元素丟到left中,然后為了保持數量關系,將調整過后的left的堆頂元素移到right中即可。

細節處理:

1、我們在比較的時候始終實用left的元素進行比較,因為左邊不為空的時候右邊也可能為空,所以我們如果不用left去比較而是用right去比較,那么還需要多考慮一種邊界情況。

2、雖然我們add的都是int類型,但是當兩個堆的元素個數相同的時候,我們去取兩個堆頂元素取平均值的,而平均值是有可能會出現小數的,所以如果我們還用int的話可能會造成小數點丟失,所以我們在/2的時候變成/2.0,這樣結果就會被強轉成double;

class MedianFinder {
public:MedianFinder() {} //默認初始化不管了void addNum(int num) {//分類討論 m==n或者m==n+1size_t m=left.size(),n=right.size();if(m==n) //m==n->m==n+1{//如果我比左邊的堆頂小,或者是為空,我就進左邊if(m==0||num<=left.top()) left.push(num);else //如果我比堆頂大,那我要進右邊,然后把右邊的移過來{right.push(num);left.push(right.top());right.pop();}}else // m==n+1 ->m==n{//如果我比左邊的小,直接進右邊即可if(num <= left.top()) {left.push(num);right.push(left.top());left.pop(); }else //如果我比左邊的大 無腦進右邊 right.push(num);}}double findMedian() { //我們的策略是 m==n 返回堆頂平均值  如果m==n+1 返回左邊的堆頂if(left.size()>right.size()) return left.top();else return (left.top()+right.top())/2.0;}private:priority_queue<int> left;//左邊是大根堆priority_queue<int,vector<int>,greater<int>> right;///右邊是小根堆
};

四、?前K個高頻詞匯

. - 力扣(LeetCode)

該題是一道非常經典的OJ題,在哈希表章節中介紹了四種解法,運用stl中的不同容器去解決。

算法思想總結:哈希表-CSDN博客

class Solution {
public:typedef pair<string,int> PSI;struct compare//要注意仿函數要+const修飾,否則可能編譯不過{bool operator()(const PSI&kv1,const PSI&kv2) const{if(kv1.second==kv2.second) return kv1.first<kv2.first;return kv1.second>kv2.second;}};vector<string> topKFrequent(vector<string>& words, int k) {unordered_map<string,int> countmap;//計數for(auto&s:words) ++countmap[s];//丟到優先級隊列里priority_queue<PSI,vector<PSI>,compare> heap;for (auto& it : countmap) {heap.push(it);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;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41046.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS 7配置阿里云鏡像源及其加速

備份原yum源的配置&#xff1a;mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下載Centos-7.repo文件curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清除及生成緩存 # 清除yum緩存 yum clean …

HarmonyOS - 通過.p7b文件獲取fingerprint

1、查詢工程所對應的 .p7b 文件 通常新工程運行按照需要通過 DevEco Studio 的 Project Structure 勾選 Automatically generate signature 自動生成簽名文件&#xff0c;自動生成的 .p7b 文件通常默認在系統用戶目錄下. 如&#xff1a;C:/Users/zhangsan/.ohos/config/default…

【Thread】python Thread Timer使用示例

import threading import time# 定義一個函數&#xff0c;它接受可變數量的字符串參數 def print_message(*messages):for message in messages:print(message)# 定義一個函數&#xff0c;它作為定時器線程的回調函數 def timer_thread(wait_time, *args):print(f"等待 {w…

JavaSE面試題(二)

目錄 一.為什么會有Java內存模型&#xff1f; 二.什么樣的情況下finally不會執行 三.鉤子是什么&#xff1f; 四.編譯時期的多態性和運行時期的多態性 五.談談反射機制 六.Java管道 本專欄全是博主自己收集的面試題&#xff0c;僅可參考&#xff0c;不能相信面試官就出這…

TCP報文校驗和(checksum)計算

一. 原理 將TCP相關內容&#xff08;TCP偽頭部TCP頭部TCP內容&#xff09;轉換成16比特的字符&#xff0c;然后進行累加&#xff0c;最后結果進行取反。TCP偽頭部是固定的&#xff0c;下文有相關代碼展示。 二. 源碼 源碼 #include <stdio.h> #include <stdlib.h&…

3D雞哥又上開源項目!單圖即可生成,在線可玩

大家好&#xff0c;今天和大家分享幾篇最新的工作 1、Unique3D Unique3D從單視圖圖像高效生成高質量3D網格&#xff0c;具有SOTA水平的保真度和強大的通用性。 如下圖所示 Unique3D 在 30 秒內從單視圖野生圖像生成高保真且多樣化的紋理網格。 例如屬于一張雞哥的打球寫真照 等…

js 遞歸調用 相同對象--數組遞歸調用

<div class="save-cl"> <a-button @click="saveCl" >保存為常用策略</a-button> </div> saveCl(){ console.log(this.form.filterList[0],--------常用策略)// 此對象為上圖對象 console.log(this.allElementsHaveValue(thi…

Windows的管理工具

任務計劃程序&#xff1a;這是一個用來安排任務自動運行的工具。你可以在這里創建新的任務&#xff0c;設定觸發條件&#xff0c;并指定任務的操作。 事件查看器&#xff1a;這是一套日志記錄和分析工具&#xff0c;&#xff0c;你可以了解到系統的工作狀況&#xff0c;幫助診…

損失函數篇

損失函數 1、邊界框損失函數/回歸損失函數bbox_loss 2、分類損失函數cls_loss 3、置信度損失函數obj_loss YOLOv8損失函數 1、概述 通過YOLOv8-訓練流程-正負樣本分配的介紹&#xff0c;我們可以知道&#xff0c;經過預處理與篩選的過程得到最終的訓練數據&#xff1a; a…

微信小程序/uniapp:class和style不生效的問題

非常重要&#xff1a;小程序端不支持 classObject 和 styleObject 語法。 文檔&#xff1a;https://uniapp.dcloud.net.cn/tutorial/vue-basics.html#class-與-style-綁定 目錄 對象語法數組語法字符串語法computed其他方案 對象語法 <!-- class --> <view class&quo…

AI是在幫助開發者還是取代它們?

在這個科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;已經滲透到了我們生活的方方面面&#xff0c;尤其是在軟件開發和編程領域&#xff0c;其影響更是深遠。AI技術的飛速發展引發了廣泛討論&#xff1a;它究竟是開發者們的得力助手&#xff0c;還是未來可…

2024 年最佳 Figma 字體

字體不僅僅是文本字符&#xff0c;它們還塑造了用戶體驗。從引導用戶瀏覽界面到傳達品牌個性&#xff0c;字體對于設計??至關重要。然而&#xff0c;找到適合您的網站或應用風格的完美字體可能具有挑戰性。 但不要害怕&#xff0c;我們會幫助您&#xff01;請繼續關注&#x…

C語言 指針和數組——指針的算術運算

目錄 指針的算術運算 指針加上一個整數 指針減去一個整數 指針相減 指針的關系比較運算 小結 指針的算術運算 指針加上一個整數 指針減去一個整數 指針相減 指針的關系比較運算 小結 ? 指針變量 – 指針類型的變量&#xff0c;保存地址型數據 ? 指針變量與其他類型…

負載均衡(服務器)

vi /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network 防火墻 systemctl stop firewalld systemctl disable firewalld vi /etc/selinux/config setenforce 0 yum install gcc gcc-c mkdir /lnmp cd /lnmp/ tar -zxvf zlib-1.2.12.tar.gz tar -zxv…

在Ubuntu 16.04上安裝和配置ownCloud的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 ownCloud 是一個文件共享服務器&#xff0c;允許您將個人內容&#xff08;如文檔和圖片&#xff09;存儲在一個類似 Dropbox 的集…

[C++][CMake][CMake基礎]詳細講解

目錄 1.CMake簡介2.大小寫&#xff1f;3.注釋1.注釋行2.注釋塊 4.日志 1.CMake簡介 CMake是一個項目構建工具&#xff0c;并且是跨平臺的 問題 – 解決 如果自己動手寫Makefile&#xff0c;會發現&#xff0c;Makefile通常依賴于當前的編譯平臺&#xff0c;而且編寫Makefile的…

vue的學習--day3

1、嘗試使用json文件模擬增刪改查 json server:準備一份自己的數據&#xff08;這里我用的是老師給的&#xff09;。 轉到d盤&#xff0c;然后打開json文件&#xff1a; 下面模擬增刪改查&#xff1a; 借助工具postman或apifox或apipost&#xff1a; 這里我下載了apifox&…

前端之CSS篇--面試題總結

CSS的特性&#xff1a;繼承性、層疊性、優先級 優先級&#xff1a;寫css樣式的時候&#xff0c;會給同一個元素添加多個樣式&#xff0c;此時誰的權重搞就顯示誰的樣式。 !important >行內樣式>id>類>標簽>全局選擇器 隱藏元素的方法 display:none 元素在頁面…

產品公告 | MemFire Cloud 現已支持微信授權登錄,為移動應用帶來更便捷的認證服務

MemFire Cloud推出的“開箱即用”的后端服務&#xff0c;提供了云數據庫、身份驗證與授權、云存儲、靜態托管、實時realtime、自動生成API等功能&#xff0c;本次升級新增/優化功能如下&#xff1a; 標題微信授權登錄&#xff08;移動應用&#xff09; 為了順應國內用戶的使用…

Python面試題:如何在 Python 中實現單例模式?

在 Python 中&#xff0c;有多種方法可以實現單例模式&#xff08;Singleton Pattern&#xff09;。單例模式是一種設計模式&#xff0c;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。以下是幾種常見的方法來實現單例模式&#xff1a; 方法一&#xff1a;使用類變…