leetcode算法刷題的第二十六天

今天主要是要用貪心算法來解決重置區間的問題。

1.leetcode 452.用最少數量的箭引爆氣球

題目鏈接

class Solution {
public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}int findMinArrowShots(vector<vector<int>>& points) {if(points.size()==0) return 0;sort(points.begin(),points.end(),cmp);//這里不加cmp函數也可以int result=1;//points不為空至少需要一支箭for(int i=1;i<points.size();i++){if(points[i][0]>points[i-1][1]){//氣球i和氣球i-1不挨著,所以注意這里不是>=result++;//需要再加上一支箭}else{//氣球i和氣球i-1挨著points[i][1]=min(points[i][1],points[i-1][1]);//更新重置氣球的最小右邊界}}return result;}
};

溫馨提示:

注意題目中說的是:滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。那么說明兩個氣球挨在一起不重疊也可以一起射爆,

所以代碼中?if (points[i][0] > points[i - 1][1])?不能是>=

思路總結:

局部最優:當氣球出現重疊,一起射,所用弓箭最少。全局最優:把所有氣球射爆所用弓箭最少。

這道題目貪心的思路很簡單也很直接,就是重復的一起射了,但本題我認為是有難度的。

就算思路都想好了,模擬射氣球的過程,很多同學真的要去模擬了,實時把氣球從數組中移走,這么寫的話就復雜了。

而且尋找重復的氣球,尋找重疊氣球最小右邊界,其實都有代碼技巧。

貪心題目有時候就是這樣,看起來很簡單,思路很直接,但是一寫代碼就感覺賊復雜無從下手。

這里其實是需要代碼功底的,那代碼功底怎么練?

多看多寫多總結!

2.leetcode 435.無重疊區間

題目鏈接

class Solution {
public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if(intervals.size()==0) return 0;sort(intervals.begin(),intervals.end(),cmp);int count=1;// 記錄非交叉區間的個數int end=intervals[0][1];// 記錄區間分割點for(int i=1;i<intervals.size();i++){if(end<=intervals[i][0]){end=intervals[i][1];count++;}}return intervals.size()-count;//記錄有多少符合條件的,再用總長度減去符合條件的就是需要去除的}
};

思路總結:

相信很多同學看到這道題目都冥冥之中感覺要排序,但是究竟是按照右邊界排序,還是按照左邊界排序呢?

其實都可以。主要就是為了讓區間盡可能的重疊。

我來按照右邊界排序,從左向右記錄非交叉區間的個數。最后用區間總數減去非交叉區間的個數就是需要移除的區間個數了

此時問題就是要求非交叉區間的最大個數。

大家此時會發現如此復雜的一個問題,代碼實現卻這么簡單!

3.leetcode 763.劃分字母區間

題目鏈接

class Solution {
public:vector<int> partitionLabels(string s) {int hash[27]={0};// i為字符,hash[i]為字符出現的最后位置for(int i=0;i<s.size();i++){// 統計每一個字符最后出現的位置hash[s[i]-'a']=i;}vector<int> result;int left=0;int right=0;for(int i=0;i<s.size();i++){right=max(right,hash[s[i]-'a']);// 找到字符出現的最遠邊界if(i==right){result.push_back(right-left+1);left=i+1;}}return result;}
};

思路總結:

一想到分割字符串就想到了回溯,但本題其實不用回溯去暴力搜索。

題目要求同一字母最多出現在一個片段中,那么如何把同一個字母的都圈在同一個區間里呢?

如果沒有接觸過這種題目的話,還挺有難度的。

在遍歷的過程中相當于是要找每一個字母的邊界,如果找到之前遍歷過的所有字母的最遠邊界,說明這個邊界就是分割點了。此時前面出現過所有字母,最遠也就到這個邊界了。

可以分為如下兩步:

統計每一個字符最后出現的位置

從頭遍歷字符,并更新字符的最遠出現下標,如果找到字符最遠出現位置下標和當前下標相等了,則找到了分割點

這道題目leetcode標記為貪心算法,說實話,我沒有感受到貪心,找不出局部最優推出全局最優的過程。就是用最遠出現距離模擬了圈字符的行為。

但這道題目的思路是很巧妙的,所以有必要介紹給大家做一做,感受一下。

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

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

相關文章

BlueZ 學習之GATT Server開發

Linux下&#xff0c;使用C語言開發一個簡單的GATT Server&#xff0c;我的Ubuntu上跑的BlueZ版本是5.79&#xff0c;使用的GLib庫版本是2.85.2&#xff0c;這里我直接使用GLib里的D?Bus來實現與BlueZ通信。BlueZ 官方推薦通過 D-Bus 進行通信和控制&#xff0c;如果是要使用原…

【Linux基礎】Linux文件系統深度解析:EXT4與XFS技術詳解與應用

目錄 引言 1 Linux文件系統概述 1.1 文件系統的基本概念 1.2 日志文件系統的概念 2 EXT4文件系統詳解 2.1 EXT4概述 2.2 EXT4的磁盤結構 2.3 EXT4的inode結構 2.4 EXT4的新特性 2.4.1 Extents 2.4.2 延遲分配 2.4.3 快速文件系統檢查 2.5 EXT4的性能特點 3 XFS文…

埃文科技榮獲2025年“數據要素×”大賽河南分賽二等獎

2025年8月19日&#xff0c;2025年“數據要素”大賽河南分賽決賽在鄭州舉行&#xff0c;本屆河南分賽聚焦數據價值賦能。鄭州埃文科技有限公司&#xff08;以下簡稱“埃文科技”&#xff09;憑借其前沿成果“IP地址高精度地理定位及應用場景劃分數據集”&#xff0c;從500多支參…

鏈上迷局:區塊鏈技術的法律暗礁與合規導航

高鵬律師首席數據官&#xff0c;數字經濟團隊創作AI輔助區塊鏈&#xff0c;這個被譽為“信任機器”的技術&#xff0c;正以顛覆性的力量重塑數字經濟的底層邏輯。從比特幣的橫空出世到NFT的全民狂歡&#xff0c;從DeFi的金融革命到DAO的組織重構&#xff0c;技術永不眠&#xf…

線性代數基礎 | 基底 / 矩陣 / 行列式 / 秩 / 線性方程組

注&#xff1a;本文為 “線性代數基礎 ” 相關合輯。 略作重排&#xff0c;未作全校。 如有內容異常&#xff0c;請看原文。 線性代數的本質&#xff08;1&#xff09;——基底、向量、線性變換、逆陣、行列式 野指針小李于 2020-08-13 16:34:45 發布 零、基底 在展開后續內…

GORM.io詳細指南

GORM.io 詳細指南 GORM&#xff08;全稱 Go ORM&#xff09;是一個功能豐富的 ORM&#xff08;Object-Relational Mapping&#xff09;庫&#xff0c;用于 Go 語言。它簡化了數據庫操作&#xff0c;將 SQL 查詢映射到 Go 結構體&#xff0c;支持多種數據庫后端。GORM 的設計理念…

【Flask】測試平臺開發,應用管理模塊實現-第十一篇

概述通過Element UI抽屜和表單校驗&增改接口合并實現應用管理Drawer 抽屜之前產品修改和添加是使用Dialog組件實現的&#xff0c;但這個組件有時候并不滿足我們的需求, 比如表單很長, 亦或是你需要臨時展示一些文檔, Drawer 是可以從側面彈出的一個層&#xff0c;可以容納更…

Elasticsearch 深分頁限制與解決方案

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。在項目中遇到一個…

基于偏最小二乘法PLS多輸入單輸出的回歸預測【MATLAB】

基于偏最小二乘法&#xff08;PLS&#xff09;多輸入單輸出的回歸預測【MATLAB】 在科學研究和工程實踐中&#xff0c;我們常常需要根據多個相關變量來預測一個關鍵結果。例如&#xff0c;根據氣溫、濕度、風速等多個氣象因素預測空氣質量指數&#xff0c;或根據多種原材料成分…

SQL Server核心架構深度解析

SQL Server 的體系結構是一個復雜但設計精密的系統&#xff0c;主要可以分為四大核心組件&#xff0c;它們協同工作以管理數據庫、處理查詢、確保數據安全與一致性。以下是其體系結構的核心組成部分&#xff1a; 核心組件&#xff1a;協議層 (Protocol Layer) 作用&#xff1a;…

Django REST Framework Serializer 進階教程

1. 序列化器概述 在 Django REST Framework&#xff08;DRF&#xff09;中&#xff0c;序列化器&#xff08;Serializer&#xff09;用于將復雜的數據類型&#xff08;如模型實例&#xff09;轉換為 JSON 格式&#xff0c;以便于 API 返回給客戶端。此外&#xff0c;序列化器還…

面試問題詳解十四:Qt 多線程同步【QSemaphore】講解

在多線程開發中&#xff0c;經常需要控制多個線程對共享資源的訪問數量。例如限制同時下載文件的數量、控制數據庫連接池的連接使用等等。這時候&#xff0c;Qt 提供的 QSemaphore&#xff08;信號量&#xff09;就非常派得上用場。一、什么是 QSemaphore&#xff1f; QSemapho…

Spark mapGroups 函數詳解與多種用法示例

mapGroups 是 Spark 中一個強大的分組操作函數&#xff0c;它允許你對每個分組應用自定義邏輯并返回一個結果。以下是多個使用簡單樣例數據的具體用法示例。基礎示例數據假設我們有一個簡單的學生成績數據集&#xff1a;// 創建示例DataFrame val studentScores Seq(("Ma…

【圖論】Graphs.jl 圖數據的讀寫與生成器

文章目錄圖數據的讀寫Graphs.loadgraphGraphs.loadgraphsGraphs.savegraph保存單個圖保存圖字典Graphs.loadlg_multGraphs.savelgGraphs.savelg_mult圖的生成器1. 隨機圖模型1.1 Erd?s–Rnyi 模型1.2 巴拉巴西-阿爾伯特模型 (無標度網絡)1.3 小世界網絡模型1.4 隨機塊模型 (SB…

Go指針全解析:從基礎到實戰

基本概念與定義指針的定義指針是一種特殊的變量類型&#xff0c;它存儲的不是實際數據值&#xff0c;而是另一個變量在計算機內存中的地址。在底層實現上&#xff0c;指針本質上是保存內存位置的無符號整數&#xff0c;它直接指向內存中的特定位置&#xff0c;允許程序直接操作…

Oracle 查詢有哪些用戶 提示用戶名密碼無效

要查詢 Oracle 數據庫中的所有用戶&#xff0c;可以使用以下 SQL 查詢語句。這個查詢將返回數據庫中所有用戶的列表。 [] SELECT username FROM all_users ORDER BY username;如果你有足夠的權限&#xff08;通常是 DBA 權限&#xff09;&#xff0c;你也可以使用 dba_users 視…

小白成長之路-develops -jenkins部署lnmp平臺

文章目錄一、準備工作1.1兩臺虛擬機1.2配置文件1.3免密登錄二、實戰1.構建主item2.測試nginx,php,mysql2.1新建測試項目2.2與正式項目綁定構建后的操作2.3測試2.4導入discuz項目總結一、準備工作 1.1兩臺虛擬機 服務器&#xff1a;192.168.144.24 客戶端&#xff1a;192.168.…

【HarmonyOS 6】仿AI喚起屏幕邊緣流光特效

【HarmonyOS 6】仿AI喚起屏幕邊緣流光特效 一、前言 最近在做 HarmonyOS 6.0 的適配&#xff0c;發現 Beta1版本里多了個很實用的視效功能——自帶背景的雙邊流光。 之前做屏幕邊緣流光特效的時候&#xff0c;要么得自己寫漸變動畫拼效果&#xff0c;要么就得套好幾個組件疊層&…

跟做springboot尚品甄選項目

springbootvue3 【尚硅谷Java項目《尚品甄選》 SpringBootSpringCloud萌新學會企業級java項目】003.后臺系統-搭建前端環境&#xff08;工程創建&#xff09;_嗶哩嗶哩_bilibili E:\project\AllProJect\Shangpin Selection\項目材料素材\課件\尚品甄選項目課件 前端套用框架…

【Linux】創建線程

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 文章目錄 一、為什么需要線程&#xff1f; 創建線程 示例&#xff1a;計算斐波恩夕法 一、為什么需要線程&#xff1f; 在多核處理器的計算機上&#xff0c;線程可…