我在代碼隨想錄|寫代碼Day30 | 貪心算法 | 435. 無重疊區間,763.劃分字母區間, 56. 合并區間, 738.單調遞增的數字

在這里插入圖片描述

🔥博客介紹`: 27dCnc

🎥系列專欄: <<數據結構與算法>> << 算法入門>> << C++項目>>

🎥 當前專欄: <<數據結構與算法>>

專題 : 數據結構幫助小白快速入門算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆

??感謝大家點贊👍收藏?評論??

在這里插入圖片描述

學習目標:

今日學習打卡
在這里插入圖片描述

  • 代碼隨想錄-貪心算法

學習時間:

  • 周一至周五晚上 7 點—晚上9點
  • 周六上午 9 點-上午 11 點
  • 周日下午 3 點-下午 6 點

學習內容:

  1. 無重疊區間
  2. 劃分字母區間
  3. 合并區間
  4. 單調遞增的數字

內容詳細:

無重疊區間

題目考點: 貪心 區間

在這里插入圖片描述

解題思路

排序,找重疊區間,然后標記排除

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

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

這里記錄非交叉區間的個數還是有技巧的,如圖:
在這里插入圖片描述

class Solution {
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),[](const vector<int>&a,const vector<int>&b) {return a[0] < b[0];});if (intervals.size() == 0) return 0;int cnt = 0;int end = intervals[0][1];for(int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= end) end = intervals[i][1]; //無重疊情況else {end = min(end,intervals[i][1]);cnt++; //記錄重疊情況}}return cnt;}
};

劃分字母區間

題目考點: 貪心

在這里插入圖片描述

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

可以分為如下兩步:

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

在這里插入圖片描述

代碼

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> ans;int left = 0;int right = 0;for (int i = 0; i < S.size(); i++) {right = max(right, hash[S[i] - 'a']); // 找到字符出現的最遠邊界if (i == right) {ans.push_back(right - left + 1);left = i + 1;}}return ans;}
};

合并區間

題目考點: 區間 貪心
在這里插入圖片描述

題解

對區級左右端點的一個端點進行排序, 然后查找重疊區間

這幾道題都是判斷區間重疊,區別就是判斷區間重疊后的邏輯,本題是判斷區間重貼后要進行區間合并。

所以一樣的套路,先排序,讓所有的相鄰區間盡可能的重疊在一起,按左邊界,或者右邊界排序都可以,處理邏輯稍有不同。

按照左邊界從小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1] 即intervals[i]的左邊界 <= intervals[i - 1]的右邊界,則一定有重疊。(本題相鄰區間也算重貼,所以是<=)

在這里插入圖片描述

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> ans;sort(intervals.begin(),intervals.end(),[](const vector<int>&a,const vector<int>&b) {return a[0] < b[0];});for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] <= intervals[i-1][1]) {intervals[i][1] = max(intervals[i][1], intervals[i-1][1]);intervals[i][0] = intervals[i-1][0];} else {ans.push_back({intervals[i-1][0],intervals[i-1][1]});}}ans.push_back({intervals.back()[0], intervals.back()[1]});return ans;}
};

單調遞增的數字

題目考點: 貪心 數據

在這里插入圖片描述

解題思路
題目要求小于等于N的最大單調遞增的整數,那么拿一個兩位的數字來舉例。

例如:98,一旦出現strNum[i - 1] > strNum[i]的情況(非單調遞增),首先想讓strNum[i - 1]–,然后strNum[i]給為9,這樣這個整數就是89,即小于98的最大的單調遞增整數。

這一點如果想清楚了,這道題就好辦了。

在這里插入圖片描述

此時是從前向后遍歷還是從后向前遍歷呢?

從前向后遍歷的話,遇到strNum[i - 1] > strNum[i]的情況,讓strNum[i - 1]減一,但此時如果strNum[i - 1]減一了,可能又小于strNum[i - 2]。

這么說有點抽象,舉個例子,數字:332,從前向后遍歷的話,那么就把變成了329,此時2又小于了第一位的3了,真正的結果應該是299。

那么從后向前遍歷,就可以重復利用上次比較得出的結果了,從后向前遍歷332的數值變化為:332 -> 329 -> 299

確定了遍歷順序之后,那么此時局部最優就可以推出全局,找不出反例,試試貪心。

代碼

class Solution {
public:int monotoneIncreasingDigits(int N) {string strNum = to_string(N);// flag用來標記賦值9從哪里開始// 設置為這個默認值,為了防止第二個for循環在flag沒有被賦值的情況下執行int flag = strNum.size();for (int i = strNum.size() - 1; i > 0; i--) {if (strNum[i - 1] > strNum[i] ) {flag = i;strNum[i - 1]--;}}for (int i = flag; i < strNum.size(); i++) {strNum[i] = '9';}return stoi(strNum);}
};

學習產出:

  • 技術筆記 2 遍
  • CSDN 技術博客 3 篇
  • 習的 vlog 視頻 1 個

在這里插入圖片描述

重磅消息:

GTP - 4 最新版接入服務他來了 點擊鏈接即可查看詳細

GTP - 4 搭建教程

🔥如果此文對你有幫助的話,歡迎💗關注、👍點贊、?收藏、??評論,支持一下博主~

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

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

相關文章

[HackMyVM]靶場 VivifyTech

kali:192.168.56.104 主機發現 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Unk…

matlab階段學習小節1

數組排序 fliplr()實現數組倒序&#xff0c;但不對大小進行排序&#xff0c;只是元素位置掉頭。 要想實現大小倒序排列&#xff0c;可以先sort()實現正序排列&#xff0c;再用fliplr倒一下 %數組運算 %矩陣 %xAb的解xb/A;(矩陣) %右除運算A/B&#xff0c;左矩陣為被除數&a…

多態——細致講解

&#x1f536;多態基礎概念 ?&#x1f536;概念 ??&#x1f531;多態性 ??&#x1f531;多態——重新(覆蓋) ?&#x1f536;示例 ??&#x1f536;基本使用方法 ??&#x1f536;特例 ???&#x1f531;協變 ???&#x1f531;析構函數重寫 ?&#x1f531;多態原理…

`useState` 和 `useImmer` 都是 React 中用于管理狀態的鉤子

useImmer如何使用&#xff1a; 安裝&#xff1a;yarn add use-immer使用&#xff1a; const [data, updateData] useImmer({fields: [], });updateData((draft) > {draft.fields.splice(index, 1, {id:1});});useState 和 useImmer 都是 React 中用于管理狀態的鉤子&…

redis實戰筆記匯總

文章目錄 1 NoSQL入門概述1.1 能干嘛&#xff1f;1.2 傳統RDBMS VS NOSQL1.3 NoSQL數據庫的四大分類1.4 分布式數據庫CAP原理 BASE原則1.5 分布式集群簡介1.6 淘寶商品信息的存儲方案 2 Redis入門概述2.1 是什么&#xff1f;2.2 能干嘛&#xff1f;2.3 怎么玩&#xff1f;核心…

46、WEB攻防——通用漏洞PHP反序列化原生類漏洞繞過公私有屬性

文章目錄 幾種常用的魔術方法1、__destruct()2、__tostring()3、__call()4、__get()5、__set()6、__sleep()7、__wakeup()8、__isset()9、__unset()9、__invoke() 三種變量屬性極客2019 PHPphp原生類 幾種常用的魔術方法 1、__destruct() 當刪除一個對象或對象操作終止時被調…

關于 yarn 的中央倉庫 registry.yarnpkg.com

"Yarn" 是一個開源的 JavaScript 包管理工具&#xff0c;用于管理項目中的依賴關系。Yarn 通過一個叫做 "registry" 的中央倉庫來存儲和檢索各種 JavaScript 包。這個中央倉庫可以通過 https://registry.yarnpkg.com/ 訪問&#xff0c;它是 Yarn 包管理系統…

像用Excel一樣用Python:pandasGUI

文章目錄 啟動數據導入繪圖 啟動 眾所周知&#xff0c;pandas是Python中著名的數據挖掘模塊&#xff0c;以處理表格數據著稱&#xff0c;并且具備一定的可視化能力。而pandasGUI則為pandas打造了一個友好的交互窗口&#xff0c;有了這個&#xff0c;就可以像使用Excel一樣使用…

數據庫運維01

數據備份多重方案 核心sql語句 mysql復制架構 mysql 生產實踐 mysql可用的集群和中間件 linux環境 linux的命令要掌握 dba數據庫管理員 it部門負責數據庫維護 一定規模的企業 健康良好的運行數據庫 對數據庫做策略&#xff0c;保證數據庫的穩定 查數據要盡快的返回 復雜的數據需…

【Spring Boot 3】的安全防線:整合 【Spring Security 6】

簡介 Spring Security 是 Spring 家族中的一個安全管理框架。相比與另外一個安全框架Shiro&#xff0c;它提供了更豐富的功能&#xff0c;社區資源也比Shiro豐富。 一般來說中大型的項目都是使用SpringSecurity 來做安全框架。小項目有Shiro的比較多&#xff0c;因為相比與Sp…

Linux線程【互斥與同步】

目錄 1.資源共享問題 1.1多線程并發訪問 1.2臨界區和臨界資源 1.3互斥鎖 2.多線程搶票 2.1并發搶票 2.2 引發問題 3.線程互斥 3.1互斥鎖相關操作 3.1.1互斥鎖創建與銷毀 3.1.2、加鎖操作 3.1.3 解鎖操作 3.2.解決搶票問題 3.2.1互斥鎖細節 3.3互斥…

github用法詳解

本文是一篇面向全體小白的文章,圖文兼備。為了讓小白們知道如何使用GitHub,我努力將本文寫得通俗易懂,盡量讓剛剛上網的小白也能明白。所以各位程序員們都可以滑走了~ 啥是GitHub? 百度百科會告訴你, GitHub是一個面向開源及私有軟件項目的托管平臺,因為只支持Git作為…

大模型訓練——PEFT與LORA介紹

大模型訓練中的PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09;與LoRA&#xff08;Low-Rank Adaptation&#xff09;是兩種重要的技術&#xff0c;它們在大型預訓練模型的應用中發揮著重要作用。 首先&#xff0c;讓我們來了解一下PEFT。PEFT是一種參數高效的微…

GO基本類型

Go語言同時提供了有符號和無符號的整數類型。 有符號整型&#xff1a;int、int8、int64、int32、int64無符號整型&#xff1a;uint、uint8、uint64、uint32、uint64、uintptr 有符號整型范圍&#xff1a;-2^(n-1) 到 2^(n-1)-1 無符號整型范圍: 0 到 2^n-1 實際開發中由于編…

英語中的提問方式(問法)(bug提問、bug描述)

文章目錄 英語提問方式一、單詞、短語、句子的意思1.1 提問單詞的意思1.2 提問短語的意思1.3 提問句子的意思 二、在編程中提問2.1 提問bug2.2 請求代碼幫助 如何提出反問句1. 構建反問句的基本結構2. 提問反問句的方法3. 理解反問句的意圖 在口語中提問&#xff1a;確保清晰度…

Topaz Gigapixel AI:讓每一張照片都煥發新生mac/win版

Topaz Gigapixel AI 是一款革命性的圖像增強軟件&#xff0c;它利用先進的人工智能技術&#xff0c;能夠顯著提升圖像的分辨率和質量。無論是攝影愛好者還是專業攝影師&#xff0c;這款軟件都能幫助他們將模糊的、低分辨率的照片轉化為清晰、細膩的高分辨率圖像。 Topaz Gigap…

JavaWeb——011 SpringBootWeb綜合案例(刪除/修改員工、文件上傳、配置文件)

SpringBootWeb案例 目錄 SpringBootWeb案例1. 新增員工1.1 需求1.2 接口文檔1.3 思路分析1.4 功能開發1.5 功能測試1.6 前后端聯調 2. 文件上傳2.1 簡介2.2 本地存儲2.3 阿里云OSS2.3.1 準備2.3.2 入門2.3.3 集成 3. 修改員工3.1 查詢回顯3.1.1 接口文檔3.1.2 實現思路3.1.3 代…

07 編譯器

目錄 編譯過程編譯器查看詳解函數庫自動化構建工具進度條程序 1. 編譯過程 預處理: a. 去注釋 b.宏替換 c.頭文件展開 d.條件編譯 編譯: 匯編 匯編: 可重定向二進制目標文件 鏈接: 鏈接多個.o, .obj合并形成一個可執行exe gcc編譯c程序, g編譯c程序 2. 編譯器查看 輸入gcc …

mac蘋果電腦c盤滿了如何清理內存?2024最新操作教程分享

蘋果電腦用戶經常會遇到麻煩:內置存儲器(即C盤)空間不斷縮小&#xff0c;電腦運行緩慢。在這種情況下&#xff0c;蘋果電腦c盤滿了怎么清理&#xff1f;如何有效清理和優化存儲空間&#xff0c;提高計算機性能&#xff1f;成了一個重要的問題。今天&#xff0c;我想給大家詳細介…

備戰藍橋杯---線段樹基礎2

今天我們把線段樹的另一個模板看一下&#xff1a; 在這里&#xff0c;我們注意到乘的操作&#xff0c;因此我們用兩個懶標記來分別表示加和乘&#xff0c;這時我們面臨了一個問題&#xff0c;就是當我們把標記往下傳時&#xff0c;它的兒子怎么知道是先乘還是先加&#xff1f; …