Leedcode刷題 | Day31_貪心算法05

?一、學習任務

  • 56. 合并區間代碼隨想錄
  • 738. 單調遞增的數字
  • 968. 監控二叉樹

二、具體題目

1.56合并區間56. 合并區間 - 力扣(LeetCode)

給出一個區間的集合,請合并所有重疊的區間。

示例 1:

  • 輸入: intervals = [[1,3],[2,6],[8,10],[15,18]]
  • 輸出: [[1,6],[8,10],[15,18]]
  • 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6].

示例?2:

  • 輸入: intervals = [[1,4],[4,5]]
  • 輸出: [[1,5]]
  • 解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。
  • 注意:輸入類型已于2019年4月15日更改。 請重置默認代碼定義以獲取新方法簽名。

判斷重復之后,用合并區間后左邊界和右邊界,作為一個新的區間,加入到result數組里就可以了。如果沒有合并就把原區間加入到result數組。

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() == 0) return result; // 區間集合為空直接返回// 排序的參數使用了lambda表達式sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});// 第一個區間就可以放進結果集里,后面如果重疊,在result上直接合并result.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) { // 發現重疊區間// 合并區間,只更新右邊界就好,因為result.back()的左邊界一定是最小值,因為我們按照左邊界排序的result.back()[1] = max(result.back()[1], intervals[i][1]); } else {result.push_back(intervals[i]); // 區間不重疊 }}return result;}
};

2.738單調遞增的數字738. 單調遞增的數字 - 力扣(LeetCode)

給定一個非負整數?N,找出小于或等于?N?的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。

(當且僅當每個相鄰位數上的數字?x?和?y?滿足?x <= y?時,我們稱這個整數是單調遞增的。)

示例 1:

  • 輸入: N = 10
  • 輸出: 9

示例 2:

  • 輸入: N = 1234
  • 輸出: 1234

示例 3:

  • 輸入: N = 332
  • 輸出: 299

說明: N?是在?[0, 10^9]?范圍內的一個整數。

代碼如下:

重點:

  1. 例如:98,一旦出現strNum[i - 1] > strNum[i]的情況(非單調遞增),首先想讓strNum[i - 1]--,然后strNum[i]給為9,這樣這個整數就是89,即小于98的最大的單調遞增整數。
  2. 遍歷順序:從前向后遍歷的話,遇到strNum[i - 1] > strNum[i]的情況,讓strNum[i - 1]減一,但此時如果strNum[i - 1]減一了,可能又小于strNum[i - 2]。所以應該從后往前遍歷。

  3. 小小細節:用一個flag來標記從哪里開始往后全部賦值9,因為一旦某一位是9,后面將都是9;如果使用每一次前一位--,后一位賦值9的方法的話,遇到1000的情況,結果將會變為900而不是999。

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);}
};

3.968監控二叉樹968. 監控二叉樹 - 力扣(LeetCode)

給定一個二叉樹,我們在樹的節點上安裝攝像頭。

節點上的每個攝影頭都可以監視其父對象、自身及其直接子對象。

計算監控樹的所有節點所需的最小攝像頭數量。

示例 1:

  • 輸入:[0,0,null,0,0]
  • 輸出:1
  • 解釋:如圖所示,一臺攝像頭足以監控所有節點。

示例 2:

  • 輸入:[0,0,null,0,null,0,null,null,0]
  • 輸出:2
  • 解釋:需要至少兩個攝像頭來監視樹的所有節點。 上圖顯示了攝像頭放置的有效位置之一。

提示:

  • 給定樹的節點數的范圍是 [1, 1000]。
  • 每個節點的值都是 0。

從下往上看,局部最優:讓葉子節點的父節點安攝像頭,所用攝像頭最少,整體最優:全部攝像頭數量所用最少!

此時,大體思路就是從低到上,先給葉子節點父節點放個攝像頭,然后隔兩個節點放一個攝像頭,直至到二叉樹頭結點。

見注釋:

// 版本一
class Solution {
private:int result;int traversal(TreeNode* cur) {// 空節點,該節點有覆蓋if (cur == NULL) return 2;int left = traversal(cur->left);    // 左int right = traversal(cur->right);  // 右// 情況1// 左右節點都有覆蓋if (left == 2 && right == 2) return 0;// 情況2// left == 0 && right == 0 左右節點無覆蓋// left == 1 && right == 0 左節點有攝像頭,右節點無覆蓋// left == 0 && right == 1 左節點有無覆蓋,右節點攝像頭// left == 0 && right == 2 左節點無覆蓋,右節點覆蓋// left == 2 && right == 0 左節點覆蓋,右節點無覆蓋if (left == 0 || right == 0) {result++;return 1;}// 情況3// left == 1 && right == 2 左節點有攝像頭,右節點有覆蓋// left == 2 && right == 1 左節點有覆蓋,右節點有攝像頭// left == 1 && right == 1 左右節點都有攝像頭// 其他情況前段代碼均已覆蓋if (left == 1 || right == 1) return 2;// 以上代碼我沒有使用else,主要是為了把各個分支條件展現出來,這樣代碼有助于讀者理解// 這個 return -1 邏輯不會走到這里。return -1;}public:int minCameraCover(TreeNode* root) {result = 0;// 情況4if (traversal(root) == 0) { // root 無覆蓋result++;}return result;}
};

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

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

相關文章

app逆向專題五:新快報app數據采集

app逆向專題五:新快報app數據采集 一、抓包尋找數據接口二、編寫代碼三、完整代碼一、抓包尋找數據接口 打開charles,并在手機端打開新快報app,點擊“廣州”或者“經濟”等選項卡,抓包,尋找數據接口,如圖所示: 二、編寫代碼 這里介紹一種簡便的代碼編寫方法,在數據…

Java面試黃金寶典45

1. 非對稱加密 RSA 定義:RSA 是一種廣泛使用的非對稱加密算法,其安全性基于大整數分解的困難性。它使用一對密鑰,即公鑰和私鑰。公鑰可公開用于加密消息,而私鑰必須保密,用于解密由相應公鑰加密的消息。要點: 公鑰公開,私鑰保密,二者成對出現。加密和解密使用不同的密鑰…

提權實戰!

就是提升權限&#xff0c;當我們拿到一個shell權限較低&#xff0c;當滿足MySQL提權的要求時&#xff0c;就可以進行這個提權。 MySQL數據庫提權&#xff08;Privilege Escalation&#xff09;是指攻擊者通過技術手段&#xff0c;從低權限的數據庫用戶提升到更高權限&#xff…

在虛擬機上修改saprk的版本

之前安裝的spark版本是3.4&#xff0c;現在實驗需要的版本是2.4。現在需要更改spark的版本。 方法很簡單&#xff1a; 直接將原有的spark3.4的文件刪除&#xff0c;再安裝2.4版本。 安裝過程之后再寫。Spark2.1.0入門&#xff1a;Spark的安裝和使用_廈大數據庫實驗室博客

文獻分享: DESSERT基于LSH的多向量檢索(Part3.2.外部聚合的聯合界)

原論文 文章目錄 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的內容 1.1. \textbf{1.1. } 1.1. 一些符號 1.2. \textbf{1.2. } 1.2. 定理內容 3. \textbf{3. } 3. 聯合界限 Ps. \textbf{Ps. } Ps. 運行時間分析 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的內容 1.1. \t…

MIPI協議介紹

MIPI協議介紹 mipi 協議分為 CSI 和DSI,兩者的區別在于 CSI用于接收sensor數據流 DSI用于連接顯示屏 csi分類 csi 分為 csi2 和 csi3 csi2根據物理層分為 c-phy 和 d-phy, csi-3采用的是m-phy 一般采用csi2 c-phy 和 d-phy的區別 d-phy的時鐘線和數據線是分開的,2根線一對…

【中間件】nginx反向代理實操

一、說明 nginx用于做反向代理&#xff0c;其目標是將瀏覽器中的請求進行轉發&#xff0c;應用場景如下&#xff1a; 說明&#xff1a; 1、用戶在瀏覽器中發送請求 2、nginx監聽到瀏覽器中的請求時&#xff0c;將該請求轉發到網關 3、網關再將請求轉發至對應服務 二、具體操作…

在3ds Max中視口顯示為黑色或深灰色

在3ds Max中視口顯示為黑色或深灰色 Autodesk Support 2023年10月8日 涵蓋的產品和版本 問題&#xff1a; 在3ds Max中&#xff0c;使用“深”UI方案時視口顯示為完全黑色&#xff0c;使用“淺”UI方案時視口顯示為深灰色。 原因&#xff1a; 已為用戶界面禁用Gamma校正。…

Vue.js 中 v-if 的使用及其原理

在 Vue.js 的開發過程中&#xff0c;條件渲染是一項極為常見的需求。v-if指令作為 Vue.js 實現條件渲染的關鍵手段&#xff0c;能夠根據表達式的真假來決定是否渲染某一塊 DOM 元素。它在優化頁面展示邏輯、提升用戶體驗等方面發揮著重要作用。接下來&#xff0c;我們就深入探討…

Verilog:LED呼吸燈

模塊接口說明 信號方向描述clk輸入系統時鐘&#xff08;100MHz&#xff0c;周期10ns&#xff09;rst_n輸入低電平有效的異步復位信號led_en輸入總使能信號&#xff08;1開啟呼吸燈&#xff0c;0關閉&#xff09;speed_en輸入呼吸速度調節使能信號speed[2:0]輸入呼吸速度分級&a…

我的計算機網絡(總覽篇)

總覽--網絡協議的角度 在一個龐大的網絡中&#xff0c;該從哪里去了解呢&#xff1f;我先細細的講一下我們訪問一個網站的全部流程&#xff0c;當我們的電腦連上網絡的時候&#xff0c;就會啟動DHCP協議&#xff0c;來進行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…

開源的PMPI庫實現及示例代碼

開源的PMPI庫實現及示例代碼 PMPI (Profiling MPI) 是MPI標準中定義的接口&#xff0c;允許開發者通過攔截MPI調用進行性能測量和調試。以下是幾個常用的開源PMPI庫實現&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…

Unity 基于navMesh的怪物追蹤慣性系統

今天做項目適合 策劃想要實現一個在現有的怪物追蹤系統上實現怪物擁有慣性功能 以下是解決方案分享&#xff1a; 怪物基類代碼&#xff1a; ? using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …

PyTorch進階學習筆記[長期更新]

第一章 PyTorch簡介和安裝 PyTorch是一個很強大的深度學習庫&#xff0c;在學術中使用占比很大。 我這里是Mac系統的安裝&#xff0c;相比起教程中的win/linux安裝感覺還是簡單不少&#xff08;之前就已經安好啦&#xff09;&#xff0c;有需要指導的小伙伴可以評論。 第二章…

【區塊鏈安全 | 第三十八篇】合約審計之獲取私有數據(二)

文章目錄 前言漏洞代碼代碼審計攻擊步驟修復/開發建議審計思路前言 在【區塊鏈安全 | 第三十七篇】合約審計之獲取私有數據(一)中,介紹了私有數據、訪問私有數據實例、Solidity 中的數據存儲方式等知識,本文通過分析具體合約代碼進行案例分析。 漏洞代碼 // SPDX-Licens…

《微服務與事件驅動架構》讀書分享

《微服務與事件驅動架構》讀書分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版&#xff0c;2020 作者&#xff1a;[加] 亞當 ? 貝勒馬爾 譯者&#xff1a;溫正東 作者簡介&#xff1a; 這本書由亞當貝勒馬爾&#xff08;Adam Bellemare…

小剛說C語言刷題——第22講 二維數組

昨天我們講了一維數組&#xff0c;今天我們來講二維數組。 1.定義 二維數組是指在數組名后跟兩個方括號的數組。 2.語法格式 數據類型 數組名[下標][下標] 例如&#xff1a;int a[5][9];//表示5行9列的數組 3.訪問二維數組元素 格式&#xff1a;數組名[行坐標][列坐標]…

Vue 大文件分片上傳組件實現解析

Vue 大文件分片上傳組件實現解析 一、功能概述 1.1本組件基于 Vue Element UI 實現&#xff0c;主要功能特點&#xff1a; 大文件分片上傳&#xff1a;支持 2MB 分片切割上傳實時進度顯示&#xff1a;可視化展示每個文件上傳進度智能格式校驗&#xff1a;支持文件類型、大小…

「邏輯推理」AtCoder AT_abc401_d D - Logical Filling

前言 這次的 D 題出得很好&#xff0c;不僅融合了數學邏輯推理的知識&#xff0c;還有很多細節值得反復思考。雖然通過人數遠高于 E&#xff0c;但是通過率甚至不到 60%&#xff0c;可見這些細節正是出題人的側重點。 題目大意 給定一個長度為 N N N 的字符串 S S S&#…

騰訊后臺開發 一面

一、手撕 合并升序鏈表 合并兩個排序的鏈表_牛客題霸_牛客網 順時針翻轉矩陣 順時針旋轉矩陣_牛客題霸_牛客網 二、八股 1、靜態變量和實例變量 public class House {public static String buildDate "2024-10-27"; // 靜態變量public String color; // 實…