leetcode算法刷題的第二十七天

1.leetcode 56.合并區間

題目鏈接

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

思路總結:本題的本質還是判斷重疊區間的問題

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

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

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

2.leetcode 738.單調遞增的數字

題目鏈接

class Solution {
public:int monotoneIncreasingDigits(int n) {//把數字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]){strNum[i-1]--;flag=i;}}for(int i=flag;i<strNum.size();i++){strNum[i]='9';}//把字符串類型轉化成整型int result=stoi(strNum);return result;}
};

思路總結:

題目要求小于等于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

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

本題只要想清楚個例,例如98,一旦出現strNum[i - 1] > strNum[i]的情況(非單調遞增),首先想讓strNum[i - 1]減一,strNum[i]賦值9,這樣這個整數就是89。就可以很自然想到對應的貪心解法了。

想到了貪心,還要考慮遍歷順序,只有從后向前遍歷才能重復利用上次比較的結果。

最后代碼實現的時候,也需要一些技巧,例如用一個flag來標記從哪里開始賦值9。

這里解釋一下兩個特殊的函數,分別是to_string和stoi函數

to_string函數就是將一個整型變量轉化為一個字符串變量,這樣方便我們進行計算統計處理

stoi函數就是to_string函數的反向操作,將一個字符串變量轉化為一個整型變量

一般都是這兩個函數相互使用,這樣容易我們寫出一些題目

3.leetcode 968.監控二叉樹

題目鏈接

這道題是力扣里面名副其實的hard題目,大家可以感受感受,這里就直接給出題解了,就不總結了

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int result;int traversal(TreeNode* current){// 空節點,該節點有覆蓋if(current==NULL) return 2;int left=traversal(current->left);//左int right=traversal(current->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;}int minCameraCover(TreeNode* root) {result=0;//情況4if(traversal(root)==0){//root無覆蓋result++;}return result;}
};

4.貪心算法總結

貪心算法本身沒有什么規律,能寫的出來真的很不容易

貪心算法的簡單題可能往往過于簡單甚至感覺不到貪心,但是貪心的難題又真的有點難,而且貪心也沒有什么框架和套路,所以對刷題的順序沒有什么要求

1.貪心很簡單,就是常識?

跟著刷題的同學們就會發現,貪心思路往往很巧妙,并不簡單

2.貪心有沒有固定的套路?

貪心無套路,也沒有框架之類的,需要多看多練培養感覺才能想到貪心的思路。

3.究竟什么題目是貪心呢?

個人認為:如果找出局部最優并可以推出全局最優,就是貪心,如果局部最優都沒找出來,就不是貪心,可能是單純的模擬。(并不是權威解讀,一家之辭哈)

但我們也不用過于強調什么題目是貪心,什么不是貪心,那就太學術了,畢竟學會解題就行了。

4.如何知道局部最優推出全局最優,有數學證明嗎?

在做貪心題的過程中,如果再來一個數據證明,其實沒有必要,手動模擬一下,如果找不出反例,就試試貪心。面試中,代碼寫出來跑過測試用例即可,或者自己能自圓其說理由就行了

就像是 要用一下 1 + 1 = 2,沒有必要再證明一下 1 + 1 究竟為什么等于 2。(例子極端了點,但是這個道理)

很多沒有接觸過貪心的同學都會感覺貪心有啥可學的,但只要跟著這個博客堅持下來可以發現,貪心是一種很重要的算法思維而且并不簡單,貪心往往妙的出其不意,猝不及防

這也是我認為判斷這是一道貪心題目的依據,如果找不出局部最優,那可能就是一道模擬題。

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

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

相關文章

解決 Apache/WAF SSL 證書鏈不完整導致的 PKIX path building failed 問題

文章目錄解決 Apache/WAF SSL 證書鏈不完整導致的 PKIX path building failed 問題為什么會出現證書鏈錯誤&#xff1f;常見場景直連服務器正常&#xff0c;但經過 WAF 出錯Windows/Linux 下證書文件說明引入 WAF 或其他中間層&#xff1a;解決方法方法一&#xff1a;單獨配置 …

十一、標準化和軟件知識產權基礎知識

1 標準化基礎知識 1.1 基本概念 1.1.1 標準的分類 1.1.1.1 按使用范圍分類 國際標準&#xff1a;由國際組織如 ISO、IEC 制定的標準。國家標準&#xff1a;由國家標準化機構制定的標準&#xff0c;如中國的 GB&#xff0c;美國 ANSI。行業標準&#xff1a;由行業主管部門制定的…

計算機畢設選題:基于Python數據挖掘的高考志愿推薦系統

精彩專欄推薦訂閱&#xff1a;在 下方專欄&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二…

什么是PCB工藝邊?獵板給您分享設計要點

什么是PCB工藝邊&#xff1f;獵板給您分享設計要點在PCB設計和制造領域&#xff0c;工藝邊是一個看似簡單卻至關重要的概念&#xff0c;它直接關系到生產流程的順暢性與最終產品的質量。本文將為您詳細解析PCB工藝邊的定義、作用、設計要點&#xff0c;并分享獵板PCB在高精度制…

Rustdesk搭建與客戶端修改與編譯

Rustdesk是一個開源的遠程桌面工具&#xff0c;客戶端可以自己定制修改編譯 這里主要記錄一下搭建的過程 服務端搭建 主要是參考了這篇文章&#xff0c;感覺作者分享~ 在 Linux VPS 上創建 RustDesk 服務器 - 知乎 https://zhuanlan.zhihu.com/p/1922729751656765374 這里主要…

數字人系統源碼搭建與定制化開發:從技術架構到落地實踐

隨著元宇宙、直播電商、智能客服等領域的爆發&#xff0c;數字人從概念走向商業化落地&#xff0c;其定制化需求也從 “單一形象展示” 升級為 “多場景交互能力”。本文將從技術底層出發&#xff0c;拆解數字人系統的源碼搭建邏輯&#xff0c;結合定制化開發中的核心痛點&…

2025國賽C題創新論文+代碼可視化 NIPT 的時點選擇與胎兒的異常判定

2025國賽C題創新論文代碼可視化 NIPT 的時點選擇與胎兒的異常判定基于多通道LED光譜優化的人體節律調節與睡眠質量評估模型摘要無創產前檢測&#xff08;NIPT&#xff09;通過分析孕婦血漿中胎兒游離DNA來篩查染色體異常&#xff0c;其準確性很大程度上依賴于胎兒Y染色體濃度的…

2021/07 JLPT聽力原文 問題一 4番

4番&#xff1a;女の人が新しい商品の紹介をしています。よく頭が痛くなる人は、どの商品を選びますか。女&#xff1a;こちら、新発売の中國茶をご案內します。今回皆様にご紹介いたしますのは、月?星?虹?空のお茶の4種類でございます。さあ、どうぞ召し上がってください。…

爆改YOLOv8 | 即插即用的AKConv讓目標檢測既輕量又提點

突破固定卷積核的局限,讓卷積核形狀隨目標變化而動態調整 目標檢測技術在當今計算機視覺領域扮演著至關重要的角色,而YOLO系列作為其中佼佼者,以其高速和高精度獲得了廣泛應用。但在實際應用中,傳統的卷積操作存在一些固有缺陷**。本文介紹了一種創新性的改進方案——AKCon…

linux inotify 功能詳解

內核宏開啟機制inotify 功能依賴 Linux 內核宏 CONFIG_INOTIFY_USER CONFIG_INOTIFY_USER=y該宏控制用戶態程序能否調用 inotify 相關系統調用,如 inotify_init(),inotify_add_watch() inotifywait 側重實時響應,適合觸發后續操作; inotifywatch 側重數據統計,適合分析事件…

Docker Registry 實現原理、適用場景、常用操作及搭建詳解

一、實現原理 Docker Registry 是基于 無狀態服務架構 的鏡像存儲與分發系統&#xff0c;其核心設計包含以下關鍵點&#xff1a;存儲驅動抽象層 Registry 通過 storagedriver.StorageDriver 接口實現存儲解耦&#xff0c;支持多種后端存儲&#xff1a; 本地存儲&#xff1a;默認…

【LeetCode熱題100道筆記】輪轉數組

題目描述 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 步: [7,1,2,3,4,5,6] 向右輪轉 2 步: [6,7,1,2,3,4,5] 向右輪轉 3 步: [5,6,7…

【Linux我做主】細說進程等待

Linux進程等待Linux進程等待github地址0. 前言1. 進程等待的必要性1.1 避免僵尸進程與資源泄漏1.2 僵尸進程不可被直接清除1.3 獲取子進程的運行結果2. 進程等待的三個問題1. 為什么要有進程等待2. 進程等待是什么3. 怎么實現進程等待3. 僵尸進程演示4. waitwait的手冊聲明wait…

大語言模型對齊

大語言模型對齊的重要性與目標研究 一、引言 隨著大語言模型 (LLM) 能力的不斷提升和應用場景的日益廣泛,這些模型在為人類社會帶來巨大便利的同時,也引發了一系列關于安全性、可靠性和倫理問題的擔憂(9)。大語言模型的對齊 (alignment) 作為確保這些強大的 AI 系統與人類價…

數組(4)

int mid min (key - arr[min]) / (arr[max] - arr[min]) * (max - min);17.數組常見算法4 分塊查找18.數組常見算法5 冒泡排序筆記小程序錯誤#include<stdio.h> int main() {/*冒泡排序&#xff1a;1.相鄰的元素兩兩比較&#xff0c;大的放右邊&#xff0c;小的放左邊2…

STM32 讀寫備份寄存器

本章節功能利用備份寄存器&#xff08;BKP&#xff09;實現數據的掉電保存&#xff0c;并通過按鍵和OLED顯示屏進行交互。使能電源&#xff08;PWR&#xff09;和備份域&#xff08;BKP&#xff09;的時鐘&#xff08; RCC_APB1PeriphClockCmd 函數&#xff09;&#xff0c;并…

RabbitMinQ(模擬實現消息隊列項目)02

目錄 十.整合數據庫和文件數據 創建DiskDataManager類 十一.內存結構設計 創建MeneryDataCenter類: 實現集合操作: 對MemoryDataCenter類功能測試: 十二.整合內存和磁盤數據 創建VirtualHost類: Exchange: MSGQueue: Binding: 創建Router類 對Router類的TOPIC匹配…

Unity Standard Shader 解析(五)之ShadowCaster

一、ShadowCaster // ------------------------------------------------------------------// Shadow rendering passPass {Name "ShadowCaster"Tags { "LightMode" "ShadowCaster" }ZWrite On ZTest LEqualCGPROGRAM#pragma target 3.0// --…

[MRCTF2020]Ez_bypass

BUUCTF在線評測BUUCTF 是一個 CTF 競賽和訓練平臺&#xff0c;為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.cn/challenges#[MRCTF2020]Ez_bypass啟動靶機 有提示F12&#xff0c;那查看一下源碼。和頁面顯示的代碼一樣的&#xff0c;就是格式更規范而已 include…

C/C++關鍵字——union

1.介紹union是一種特殊的數據類型&#xff0c;它允許你在同一塊內存區域中存儲不同的數據類型。它的主要目的是節省內存&#xff0c;尤其是在處理多種可能的數據類型&#xff0c;但一次只使用其中一種的場景。2.特點與 struct&#xff08;結構體&#xff09;不同&#xff0c;結…