算法第26天|貪心算法:用最少數量的箭引爆氣球、無重疊區間、劃分字母區間

今日總結

用最少數量的箭引爆氣球

題目鏈接:452. 用最少數量的箭引爆氣球 - 力扣(LeetCode)

代碼隨想錄

整體思路:

? ? ? ? 1、統一度量 :

? ? ? ? ? ? ? ? 將所有區間按照左端點進行排序:

? ? ? ? ? ? ? ? ? ? ? ? 用到了二維的sort,在類中需要定義靜態成員函數cmp,從小到大排列

? ? ? ? 2、進行區間合并

? ? ? ? ? ? ? ? (1)如果沒有氣球,就是0箭

? ? ? ? ? ? ? ? (2)如果有氣球,至少1箭

? ? ? ? ? ? ? ? (3)按照排序從小到大遍歷,比較當前位置的左端點是否在前邊位置的范圍內(<=前邊位置的最小右端點)

? ? ? ? ? ? ? ? ? ? ? ? 如果在,就不加箭,只更新最小的右端點(前邊的最小右與當前的右 比較取最小)

? ? ? ? ? ? ? ? ? ? ? ? 如果不在,就加箭,更新右端點為當前氣球的右端點

整體代碼:

class Solution {
public:static bool cmp(const vector<int>&a,vector<int>&b){if(a[0]<b[0])return true;else return false;}int findMinArrowShots(vector<vector<int>>& points) {//進行排序:按照起始坐標排序://在類中,兩個維度,使用sort需要自己定義靜態比較函數cmpsort(points.begin(),points.end(),cmp);//進行比較://1、如果沒有氣球就是0支箭if(points.size()==0)return 0;//2、要是有氣球至少一支箭int sum =1;//定義右邊端點位置int res = points[0][1];//有氣球需要判斷后邊的箭的起點是不是在前邊的范圍的之內,在就不需要加箭,更新右邊的端點位置為最小 for(int i=1;i<points.size();i++){if(points[i][0]<=res){//不加箭,只更新右端點res = min(res,points[i][1]);}else{//超過了右端點,//加一支箭sum ++;//更新右端點res = points[i][1];}}return sum;}
};

無重疊區間

題目鏈接:435. 無重疊區間 - 力扣(LeetCode)

代碼隨想錄

整體思路:

? ? ? ? 1、統一度量:

? ? ? ? ? ? ? ? 將所有的區間按照第一個維度從小到大排列,如果第一個維度相同,按照第二維度小的排在前邊(第二維度大的一定是一個舍掉的區間)

? ? ? ? 2、進行區間遍歷,舍棄重疊區間

? ? ? ? ? ? ? ? 如果當前區間的左端點在上一個區間的范圍內(小于右端點,沒有等)說明這兩個區間重疊了:所以舍棄數量+1,更新右端點為小的右端點,相當于舍掉了右端點大的區間

? ? ? ? ? ? ? ? 如果當前區間的左端點不在上一個區間的范圍內,說明沒有重疊,舍棄數量不變,更新右端點為當前區間的右端點

整體代碼:

class Solution {
public://移除最小數量的區間,所以區間所占位置越小越好://[1,3],[2,3]這種,舍掉[1,3],因為戰空間大, 可能存在[0,2]//1、對所有區間,按照第一維度進行從小到大排序,第一維度相同,排列第二維度小的在前邊(大的一定是舍棄的)//2、從左到右進行遍歷,如果當前的區間的左端點在前一個區間內,說明重疊了,比較兩者的右端點,誰的右端點小,要誰,舍棄數量+1//如果當前區間的左端點不在前一個區間內,說明沒有重疊,記錄右端點位置便于下一個區間的比較,舍棄數量不變//定義sort的靜態比較函數static bool cmp(const vector<int>&a,const vector<int>&b){if(a[0]<b[0])//比較第一維度return true;else if(a[0]<=b[0]){if(a[1]<b[1])return true;else return false;}else return false;}int eraseOverlapIntervals(vector<vector<int>>& intervals) {//排序sort(intervals.begin(),intervals.end(),cmp);//如果沒有區間if(intervals.size()==0)return 0;//如果有區間int rm =0;//如果只有一個區間,不需要舍棄//定義第一個區間的右端點 ,便于后邊進行比較int right_point = intervals[0][1];//遍歷,從第二個區間開始for(int i=1;i<intervals.size();i++){//判斷當前區間的起點是否在上一個區間中,注意如果在在一個點上是不重疊的,所以沒有等號if(intervals[i][0]<right_point){//此時說明當前區間與上一個區間有重疊,需要舍棄加1,同時更新小的右區間,相當于刪掉了右端點大的區間rm ++;right_point = min(right_point,intervals[i][1]);}//如果沒有重疊else{//不需要舍棄區間,rm不變化//更新右端點為當前區間的右端點right_point = intervals[i][1];}}return rm;}
};

劃分字母區間

題目鏈接:763. 劃分字母區間 - 力扣(LeetCode)

代碼隨想錄

整體思路:

unordered_map記錄:

? ? ? ? 1、插入元素可以使用insert、下標操作符[]賦值

? ? ? ? ? ? ? ? (1)insert插入限制:

? ? ? ? ? ? ? ? ? ? ? ? mmap.insert({1,2})如果鍵1不存在插入{1,2};但是鍵 1存在就不會重復插入了

? ? ? ? ? ? ? ? (2)[]插入

? ? ? ? ? ? ? ? ? ? ? ? mmap[1]=2,如果鍵1不存在,就插入{1,2}如果鍵1存在,就更新鍵1的value為2

? ? ? ? 2、不能先判斷是否到了長度lengthh,再進行沒有到達長度時加當前段的長度,因為會出現第一個坐標0時,本身就是一段 ,此時卻不能進行額外判斷

? ? ? ? ? ? ? ? 需要先將當前位置加入之后,再判斷當前位置是不是符合寫入要求

? ? ? ? 3、使用unordered_map進行記錄每個元素的最遠位置,之后通過判斷當前元素是不是有更遠的位置,更新最遠的位置,當到達最遠位置時進行記錄,并將距離恢復為0

整體代碼:
?

class Solution {
public://最大的困難在于同一個字母必須出現在同一個片段中,這會導致分段一定是唯一解//所以需要統計每個字母最后出現的位置,只要在這個區間中,沒有其他字母最后出現的位置大于這個字母的最后位置,就可以將這個字母的最后位置當作分段點vector<int> partitionLabels(string s) {//1、統計所有字母的最后出現位置為一個數組,使用unordered_map進行記錄iunordered_map <char,int> mmap;for(int i=0;i<s.size();i++){mmap[s[i]] = i;}//2、遍歷所有元素,記錄當前區間的最遠出現位置,判斷在這個位置范圍內是否存在更遠的位置int lengthh =0;//記錄當前的段的大小int vec=0;//記錄總的分段情況vector<int>res;if(s.size()==0)return {0};for(int i=0;i<s.size();i++){//如果當前沒有到達最遠的位置,就判斷當前需不需要更新最遠位置lengthh = max(mmap[s[i]],lengthh);//同時當前段的大小+1vec++;//判斷當前是否到了最遠位置if(i==lengthh){//到了最遠位置,記錄res.push_back(vec);vec =0;//更新距離為0,進行下一個元素}}return  res;}
};

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

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

相關文章

最新版的electron通信規則

介紹: 以前electron require(electron/remote).fs 就能調用node中的各種api,最新版可能為了安全考慮,除了主main.js入口文件以外,其他的地方都不能調用node中的api,比如里面的各種函數,如fs,path等。這節課來教大家最新版本的electron如何進行通信。 結構: 了解通信之前…

Python爬蟲實戰:研究PyPLN庫相關技術

1. 引言 隨著全球化的發展,葡萄牙語作為世界第六大語言,其在互聯網上的文本數據量不斷增長。如何從海量的葡萄牙語文本中提取有價值的信息,成為自然語言處理領域的重要研究方向。 PyPLN (Python Natural Language Processing Toolkit) 是一個專門針對葡萄牙語設計的自然語言…

層次分析法代碼筆記

層次分析法 一、核心 在層次分析法中&#xff0c;通過 算術平均法、幾何平均法、特征值法 計算指標權重&#xff0c;再通過 一致性檢驗 確保判斷矩陣邏輯合理&#xff0c;為多準則決策提供量化依據。 二、代碼 &#xff08;一&#xff09;一致性檢驗&#xff08;判斷矩陣合理性…

[精選] 2025最新生成 SSH 密鑰和 SSL 證書的標準流程(Linux/macOS/Windows系統服務器通用方案)

[精選] 2025最新生成 SSH 密鑰和 SSL 證書的標準流程&#xff08;Linux/macOS/Windows系統服務器通用方案&#xff09; 在現代網絡中&#xff0c;SSH&#xff08;安全外殼協議&#xff09;和 SSL&#xff08;安全套接層協議&#xff09;是保證數據傳輸安全和身份驗證的重要技術…

開發框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud復現

PHP-ThinkphpLaravelThinkPHP是一套開源的、基于PHP的輕量級Web應用開發框架綜合工具&#xff1a;武器庫-Thinkphp專檢&#xff08;3-6版本&#xff09;如何判斷是TP6框架開發的web程序&#xff0c;基于源碼、路徑、圖標、基于報錯可發現dex.php?xxx 在其6.0.13版本及以前/?c…

uniapp+vue3小程序點擊保存圖片、保存二維碼

介紹 步驟1:引入必要的API 在script部分,確保引入了uni的相關API,如uni.downloadFile和uni.saveImageToPhotosAlbum。 步驟2:下載圖片到本地 在toInvite函數中,使用uni.downloadFile將圖片下載到本地,并獲取本地路徑。 步驟3:處理權限和保存邏輯 在saveToAlbum函數…

Golang中GROM多表關聯跟原生SQL多表關聯區別

文章目錄前言一、GROM多表關聯二、原生Sql多表關聯前言 對比GROM多表關聯和原生Sql多表關聯 一、GROM多表關聯 適用于返回全部數據需要邏輯外鍵&#xff08;不會在數據庫創建任何約束&#xff09;適合三個表以下的關聯有幾張表就會查詢幾次 type Product struct {gorm.Model …

設計模式六:工廠模式(Factory Pattern)

概念定義一個創建對象的接口&#xff0c;但讓子類決定實例化哪個類。實現示例#include <iostream> #include <memory>// 產品基類 class Product { public:virtual void use() 0;virtual ~Product() default; };// 具體產品A class ConcreteProductA : public Pr…

應用層自定義協議【序列化+反序列化】

文章目錄再談 “協議”重新理解read、write、recv、send和tcp為什么支持全雙工Server.cc網絡版計算機實現Socket封裝&#xff08;模板方法類&#xff09;socket.hpp定制協議JsonJson安裝定義一個期望的報文格式Protocol.hppParser.hppCalculator.hpp完整的處理過程Client.cc三層…

dify創建OCR工作流

實現ocr識別文件內容&#xff0c;引用dify的一個插件&#xff0c;插件名稱&#xff1a;mineru 引用在線版本mineru 具體操作說明&#xff0c;參見視頻&#xff1a; 第六篇&#xff1a;DifyOCR&#xff0c;掃描件最優解_嗶哩嗶哩_bilibili 引用本地部署mineru 上面的這種使用…

備受關注的“Facebook Email Scraper”如何操作?

Facebook Email Scraper&#xff08;臉書郵箱提取工具&#xff09;是一類用于從Facebook平臺提取公開郵箱信息的工具&#xff0c;其核心功能是通過解析用戶主頁、群組、頁面等公開內容&#xff0c;識別并提取其中包含的郵箱地址&#xff0c;為用戶提供結構化的聯系方式數據。這…

【網絡原理】萬字長文解密UDP/TCP——手把手教你理解網絡通信

目錄 1.前言 2.正文 2.1UDP協議 2.1.1UDP協議端格式 2.1.2UDP的特點 2.1.3理解UDP的“不可靠” 2.1.4面向數據報 2.1.5基于UDP的應用層協議 2.2TCP協議 2.2.1TCP協議端格式 2.2.2TCP十個核心機制 2.2.2.1確認應答 2.2.2.2超時重傳 確認應答超時重傳 vs 三次握手 …

MATLAB軟件使用頻繁,企業如何做到“少買多用”?

在制造企業的工程計算、算法研發、系統建模等場景中&#xff0c;MATLAB 已成為不可或缺的核心工具。 無論是動力學建模、控制算法開發&#xff0c;還是信號處理和數據可視化&#xff0c;MATLAB 的高頻使用場景覆蓋了從研發部門到測試部門的多個崗位。然而&#xff0c;企業 IT 負…

數據結構自學Day13 -- 快速排序--“分而治之”

&#x1f536; 一、快速排序&#xff08;Quick Sort&#xff09;&#x1f4cc; 基本思想&#xff1a;分而治之&#xff1a;每次從數組中選一個“基準”&#xff08;pivot&#xff09;&#xff0c;把比它小的放左邊&#xff0c;大的放右邊。對左右子數組遞歸排序。&#x1f9e0;…

Linux 進程與服務管理~進程基礎、進程查看、進程控制、服務管理、開機啟動??

在 Linux 系統中,進程與服務管理是運維和開發的核心技能之一。進程是程序運行的實例,服務是長期運行的后臺進程(守護進程)。掌握進程與服務的管理方法,能有效排查系統問題、優化資源使用。以下從 ??進程基礎、進程查看、進程控制、服務管理、開機啟動?? 五大模塊詳細講…

論文筆記 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes

論文地址&#xff1a;Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes 概述&#xff1a;本文提出 RGB-Stacking 基準測試&#xff0c;研究如何僅憑 RGB 攝像頭視覺和本體感知&#xff0c;實現機器人對 復雜幾何物體的高效堆疊。通過結合仿真專家訓練、交互…

React 英語打地鼠游戲——一個寓教于樂的英語學習游戲

&#x1f3af; 英語打地鼠游戲 一個寓教于樂的英語學習游戲&#xff0c;通過經典的打地鼠玩法幫助用戶學習英語單詞。 ? 項目特色 &#x1f3ae; 游戲化學習 經典打地鼠玩法&#xff1a;6 個洞穴&#xff0c;聽英文選單詞即時反饋&#xff1a;答對/答錯立即語音提示計分系…

Qt--Widget類對象的構造函數分析

Widget類對象的構造函數分析&#xff0c;用更直觀的方式解釋這段代碼的作用和工作原理&#xff1a;代碼&#xff1a;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }代碼解析 Widget::Widget(QWidget *parent) // 構造函數定…

使用pytorch創建模型時,nn.BatchNorm1d(128)的作用是什么?

在PyTorch中&#xff0c;nn.BatchNorm1d(128) 的作用是對 一維輸入數據&#xff08;如全連接層的輸出或時間序列數據&#xff09;進行批標準化&#xff08;Batch Normalization&#xff09;&#xff0c;具體功能與實現原理如下&#xff1a; 1. 核心作用 標準話數據分布 對每個批…

【數據結構】二叉樹的鏈式結構--用C語言實現

1.二叉樹的鏈式結構 此前&#xff0c;我們通過數組&#xff08;順序表&#xff09;完成了二叉樹的順序存儲&#xff0c;并實現了二叉樹的基礎功能 那么&#xff0c;二叉樹還有沒有其他存儲方式呢&#xff1f; 前面我們學習了鏈表&#xff0c;它是一種線性結構&#xff0c;而二…