4.17--4.19刷題記錄(貪心)

第一部分:準備工作

代碼隨想錄中解釋為:貪心的本質是選擇每一階段的局部最優,從而達到全局最優

而我的理解為:貪心實質上是具有最優子結構的一種算法。所有的解都能由當前最優的解組成。

第二部分:開始刷題

(1)455. 分發餅干 - 力扣(LeetCode)

代碼思路:首先對g和s進行排序,用count記錄胃口值,從前往后遍歷餅干大小,如果餅干能夠滿足胃口,則胃口++;這時候需要注意訪問超出的問題,故要加一個break判斷。

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int count=0;for(int i=0;i<s.size();i++){//遍歷每一個餅干,如果正好大于胃口,則直接賦值if(count==g.size()){break;}if(s[i]>=g[count]){count++;}}return count;}
};

(2)376. 擺動序列 - 力扣(LeetCode)

此題目有以下幾個難點:

  1. 首先要記錄差值,那么最初始化的時候ans=1
  2. 差值如何比較第一個和最后一個,這時候使用的是初始值0,和0進行比較
  3. if邏輯:如果有平數據的話怎么處理:if判斷條件中一邊=0,另一邊不等于0
  4. 更新pre和cur,每一次進行翻轉的時候才進行保存
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {//首先計算兩個的差值,并且與前一個比較int pre=0,cur=0;int ans=1;for(int i=1;i<nums.size();i++){cur=nums[i]-nums[i-1];if(pre>=0&&cur<0||pre<=0&&cur>0){ans++;pre=cur;}}return ans;}
};

(3)53. 最大子數組和 - 力扣(LeetCode)

貪心思路:

  1. 如果count累加器比當前ans大,那么就更新。
  2. 如果為正數,那么就累加(因為后面進行累加的話可以理解為在0的基礎上進行累加,正數肯定比0大)
  3. 如果為負數,那么轉換為0,后面在0的基礎上加。
class Solution {
public:int maxSubArray(vector<int>& nums) {int count=0,ans=nums[0];for(int i=0;i<nums.size();i++){count+=nums[i];if(count>ans){ans=count;}if(count<0){count=0;}}return ans;}
};

(4)122. 買賣股票的最佳時機 II - 力扣(LeetCode)

貪心思路:

  1. 注意題目為可以同一天進行操作,也就是說可以同一天買賣
  2. 如果后一天比前一天利潤大,那么賣掉。因為如果后面有更大的,呢么可以買當前的后一個到時候再賣掉。其原理等于買現在賣后面更大的。
class Solution {
public:int maxProfit(vector<int>& prices) {int profit=0;for(int i=0;i<prices.size()-1;i++){int sub=prices[i+1]-prices[i];if(sub>0){profit+=sub;}}return profit;}
};

(5)55. 跳躍游戲 - 力扣(LeetCode)

貪心思路:

  1. 不斷更新自己能去的最大值,如果能夠到達隊尾,那么就返回true
  2. 初始值的設定,far一開始為0,表示自己的第一步
  3. far>=n-1,表示到達末尾元素
class Solution {
public:bool canJump(vector<int>& nums) {int far=0;int n=nums.size();for(int i=0;i<=far;i++){far=max(far,nums[i]+i);if(far>=n-1)return true;}return false;}
};

(6)45. 跳躍游戲 II - 力扣(LeetCode)

貪心思路:

  1. 確定一個區間和一個值,區間表示這個范圍內可以到達的地方,值表示這個范圍內的下一步能夠到達的地方。
class Solution {
public:int jump(vector<int>& nums) {if(nums.size()==1)return 0;int count=0;int n=nums.size();int nextfar=0,curfar=0;for(int i=0;i<=curfar;i++){nextfar=max(nextfar,nums[i]+i);if(i==curfar){count++;curfar=nextfar;}if(curfar>=n-1)return count;}return 1;}
};

(7)1005. K 次取反后最大化的數組和 - 力扣(LeetCode)

貪心:將絕對值最大的進行翻轉。

方法一:一次排序

class Solution {
static bool cmp(int a,int b){return abs(a)>abs(b);
}
public:int largestSumAfterKNegations(vector<int>& A, int K) {sort(A.begin(), A.end(), cmp);       // 第一步for (int i = 0; i < A.size(); i++) { // 第二步if (A[i] < 0 && K > 0) {A[i] *= -1;K--;}}if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步int result = 0;for (int a : A) result += a;        // 第四步return result;}
};

方法二:兩次排序

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(),nums.end());int i;int result=0;for(i=0;i<nums.size()&&k>0;i++){if(nums[i]<0){nums[i]=-nums[i];k--;}}sort(nums.begin(),nums.end());if(k%2==1){nums[0]=0-nums[0];}for(int i:nums){result+=i;}return result;}
};

(8)134. 加油站 - 力扣(LeetCode)

貪心思路:

  1. cur_rest表示當前的剩余量,如果累加和小于零就說明從舊的start無法到達當前的i。那么新的start就要從i+1開始
  2. total_rest表示總和,如果他小于零則表示不管從哪兒開始都無法到達終點。
  3. 所以本題用貪心的思路就是選擇能夠滿足當前cur_rest的start,如果最后total大于等于零,那么就表示可達。(我的理解就是假如最后total=0,那么一定有一個分界點,使得后半部分的和能夠填滿前半部分的負數。那么就是這個start。如果總和為正數,那么就更好了。
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int start=0;int cur_rest=0,total_rest=0;for(int i=0;i<cost.size();i++){cur_rest+=gas[i]-cost[i];total_rest+=gas[i]-cost[i];if(cur_rest<0){cur_rest=0;start=i+1;}}if(total_rest<0)return -1;return start;}
};

(9)135. 分發糖果 - 力扣(LeetCode)

貪心策略:

  1. 一次是從左到右遍歷,只比較右邊孩子評分比左邊大的情況。
  2. 一次是從右到左遍歷,只比較左邊孩子評分比右邊大的情況。
class Solution {
public:int candy(vector<int>& ratings) {int n=ratings.size();vector<int>candies(n,1);int count=0;for(int i=0;i<n-1;i++){if(ratings[i]<ratings[i+1]){candies[i+1]=candies[i]+1;}}for(int i=n-1;i>0;i--){if(ratings[i]<ratings[i-1]){candies[i-1]=max(candies[i]+1,candies[i-1]);}}for(int i=0;i<n;i++){count+=candies[i];}return count;}
};

(10)860. 檸檬水找零 - 力扣(LeetCode)

貪心思路:此題比較簡單,要分三種情況進行討論

  1. 五塊的:直接++
  2. 十塊的:十塊++,五塊--
  3. 二十塊的:優先十塊--+五塊--或者五塊直接減三
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five=0,ten=0,ershi=0;for(int i=0;i<bills.size();i++){//5if(bills[i]==5){five++;}//10else if(bills[i]==10){if(five==0)return false;ten++;five--;}//20else if(bills[i]==20){//if(ten>0&&five>0){ten--;five--;ershi++;}else if(five>=3){five=five-3;ershi++;}else return false;}}return true;}
};

(11)406. 根據身高重建隊列 - 力扣(LeetCode)

貪心思路:

  1. 首先明確有兩個維度,分別是身高以及位置。如果保證位置有序的話,沒有辦法同時保證身高的有序性。那么就只能確定身高這一個維度,從而進一步確定位置
  2. 貪心的思路就是保證當前序列的有序性,那么如何保證呢?就不斷取當前元素進行插入。
class Solution {
public:static bool cmp(const vector<int>&a,const vector<int>&b){if(a[0]==b[0])return a[1]<b[1];return a[0]>b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(),people.end(),cmp);vector<vector<int>>queue;for(int i=0;i<people.size();i++){int position=people[i][1];queue.insert(queue.begin()+position,people[i]);}return queue;}
};

(12)452. 用最少數量的箭引爆氣球 - 力扣(LeetCode)

貪心思路:

  1. 首先進行排序,按照每一個氣球的直徑的最遠距離進行從小到大的排序。
  2. 貪心策略為:使用最少的針扎掉盡可能多的氣球
class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[1]<b[1];}int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(),points.end(),cmp);int arrow=1;int end=points[0][1];for(int i=1;i<points.size();i++){if(points[i][0]<=end){continue;}else{arrow+=1;end=points[i][1];}}return arrow;}
};

(13)435. 無重疊區間 - 力扣(LeetCode)

貪心思路:和上題思路一樣,秒掉

class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),cmp);int ans=1;int end=intervals[0][1];for(int i=1;i<intervals.size();i++){if(intervals[i][0]<end){continue;}else{ans+=1;end=intervals[i][1];}}return intervals.size()-ans;}
};

(14)763. 劃分字母區間 - 力扣(LeetCode)

貪心思路:給不同的字符設置最晚出現位置,在這個區間內不不斷進行擴展,如果i到達了最遠位置并沒有繼續向前擴展,則說明這是一個區間間隔。

class Solution {
public:vector<int> partitionLabels(string s) {vector<int>ans;unordered_map<char,int>cnt;for(int i=0;i<s.size();i++){cnt[s[i]]=i;}int left=0,right=0;for(int i=0;i<s.size();i++){right=max(right,cnt[s[i]]);if(i==right){ans.push_back(right-left+1);left=right+1;}}return ans;}
};

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

貪心思路:整體來講思路沒有問題,只是處理最后一個vector的時候存在一些問題。以及最后ans.push_back({start,end});使用的是方括號,因為這是數組初始化的一個方式。

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

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

貪心思路:從后往前遍歷,flag記錄從當前位置開始到結尾一直為0的數字

class Solution {
public:int monotoneIncreasingDigits(int n) {string num=to_string(n);int flag=num.size();for(int i=num.size()-1;i>0;i--){if(num[i]<num[i-1]){flag=i;//不是flag--num[i-1]--;}}for (int i = flag; i < num.size(); i++) {num[i] = '9';}return stoi(num);}
};

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

貪心思路:

  1. 節點一共有三種性質:第一種性質:未覆蓋0;第二種性質:已覆蓋2;第三種性質:裝攝像頭1
  2. 情況一共分為九種,00->1,01->1,02->1,10->1,11->2,12->2,20->1,21->2,22->0
  3. 進行分類可得:
  4. 第一類(根節點返回0):22->0,只有一種情況,當左右兩個節點都已經被當前節點的下層所監控到,根節點表示未被監控到
  5. 第二類(根節點裝攝像頭,返回1):00->1,01->1,02->1,10->1,20->1,有五種情況,只要左子樹或右子樹里面有一個0,未被覆蓋到就可以
  6. 第三類(根節點被監控到,返回2):11->2,12->2,21->2,有三種情況,只要左子樹或者右子樹有一個1,并且都沒有零即可
class Solution {
public:int ans=0;int dfs(TreeNode *root){if(root==nullptr)return 2;int left=dfs(root->left);int right=dfs(root->right);if(left==0||right==0){ans++;return 1;}else if(left==1||right==1){return 2;}else if(left==2&&right==2){return 0;}//其實根本不會遍歷到以下這個東西,所有情況都已經被包含在if中return 2;}int minCameraCover(TreeNode* root) {if(dfs(root)==0)ans++;return ans;}
};

第三部分:總結(貪心專題已經全部完結)

  1. 貪心法首先要確定思路,如何實現局部最優解,從而一步一步得到全局最優解。如果必要的時候可以用到排序,排序的話要注意函數static以及&的使用。
  2. 在代碼隨想錄中主要有幾個問題,以下幾條具體展開:首先就是多個維度,這種題一般就是先確定一個可以確定的維度,進而擴充另一個維度。(比如說9,11)
  3. 區間類的問題:比如說會議安排問題,扎氣球問題,這個就需要考慮左排序還是右排序。(比如說13,14,15)
  4. 判斷子序列的問題:這個過程中需要時刻注意一段和的正負性,如果是負數的話應該怎么辦(比如說2,3,4)
  5. 貪心中的滑動窗口問題:需要設置兩個相同類型的量,在求第一個量的時候探索第二個量的范圍,然后交換,直到求到最后一個解。(比如說5,6)

夾帶一點私活鼓勵一下自己:這是樊振東在2024巴黎奧運會上戰勝張本智和時候的一張照片。不到最后一刻,永遠都會有翻盤的機會。及時面對再大的困難,在場上還是要有一顆堅定的心。

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

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

相關文章

學習筆記十七——Rust 支持面向對象編程嗎?

&#x1f9e0; Rust 支持面向對象編程嗎&#xff1f; Rust 是一門多范式語言&#xff0c;主要以 安全、并發、函數式、系統級編程為核心目標&#xff0c;但它同時也支持面向對象的一些關鍵特性&#xff0c;比如&#xff1a; 特性傳統 OOP&#xff08;如 Java/C&#xff09;Ru…

【Linux】43.網絡基礎(2.5)

文章目錄 2.4 TCP/UDP對比2.4.1 用UDP實現可靠傳輸(經典面試題) 2.5 TCP 相關實驗2.5.1 理解 listen 的第二個參數 2.4 TCP/UDP對比 我們說了TCP是可靠連接, 那么是不是TCP一定就優于UDP呢? TCP和UDP之間的優點和缺點, 不能簡單, 絕對的進行比較TCP用于可靠傳輸的情況, 應用于…

three.js與webgl在buffer上的對應關系

一、three.js的類名 最近開始接觸three.js 看到three.js中的一些類名和webgl的很相似 不自覺的就想對比一下 二、three.js中繪制4個點 // 創建點的幾何體 const vertices new Float32Array([0.0, 0.0, 0.0, // 點11.0, 0.0, 0.0, // 點20.0, 1.0, 0.0, // 點30.…

DataWhale AI春訓營 問題匯總

1.沒用下載訓練集導致出錯&#xff0c;爆錯如下。 這個時候需要去比賽官網下載對應的初賽訓練集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初賽訓練集.zip 在命令行執行這個命令解壓 2.沒定義測試集 te…

CANFD技術在新能源汽車通信網絡中的應用與可靠性分析

一、引言 新能源汽車產業正處于快速發展階段&#xff0c;其電子系統復雜度不斷攀升&#xff0c;涵蓋眾多傳感器、控制器與執行器。高效通信網絡成為確保新能源汽車安全運行與智能功能實現的核心要素。傳統CAN總線因帶寬限制&#xff0c;難以滿足高級駕駛輔助系統&#xff08;A…

Python字典深度解析:高效鍵值對數據管理指南

一、字典核心概念解析 1. 字典定義與特征 字典&#xff08;Dictionary&#xff09;是Python中??基于哈希表實現??的無序可變容器&#xff0c;通過鍵值對存儲數據&#xff0c;具有以下核心特性&#xff1a; ??鍵值對結構??&#xff1a;{key: value}形式存儲數據??快…

C++中unique_lock和lock_guard區別

目錄 1.自動鎖定與解鎖機制 2.靈活性 3.所有權轉移 4.可與條件變量配合使用 5.性能開銷 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都屬于標準庫 <mutex> 中的互斥鎖管理工具&#xff0c;用于簡化互斥鎖的使用并確保線程安全。但它們存在一些顯著區別…

Nvidia顯卡架構演進

1 簡介 顯示卡&#xff08;英語&#xff1a;Display Card&#xff09;簡稱顯卡&#xff0c;也稱圖形卡&#xff08;Graphics Card&#xff09;&#xff0c;是個人電腦上以圖形處理器&#xff08;GPU&#xff09;為核心的擴展卡&#xff0c;用途是提供中央處理器以外的微處理器幫…

下載electron 22.3.27 源碼錯誤集錦

下載步驟同 electron源碼下載及編譯_electron源碼編譯-CSDN博客 問題1 從github 下載 dugite超時&#xff0c;原因沒有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…

洛谷P1120 小木棍

#算法/進階搜索 思路: 首先,最初始想法,將我們需要枚舉的長木棍個數計算出來,在dfs中,我們先判斷,此時枚舉這根長木棍需要的長度是否為0,如果為0,我們就枚舉下一個根木棍,接著再判斷,此時仍需要枚舉的木棍個數是否為0,如果為0,代表我們這種方案可行,直接打印長木棍長度,接著我們…

Linux教程-常用命令系列二

文章目錄 1. 系統管理常用命令1. useradd - 創建用戶賬戶功能基本用法常用選項示例 2. passwd - 管理用戶密碼功能基本用法常用選項示例 3. kill - 終止進程功能基本用法常用信號示例 4. date - 顯示和設置系統時間功能基本用法常用選項時間格式示例 5. bc - 高精度計算器功能基…

18、TimeDiff論文筆記

TimeDiff **1. 背景與動機****2. 擴散模型基礎****3. TimeDiff 模型****3.1 前向擴散過程****3.2 后向去噪過程** 4、TimeDiff&#xff08;架構&#xff09;原理訓練推理其他關鍵點解釋 DDPM&#xff08;相關數學&#xff09;1、正態分布2、條件概率1. **與多個條件相關**&…

整合SSM——(SpringMVC+Spring+Mybatis)

目錄 SSM整合 創建項目 導入依賴 配置文件 SpringConfig MyBatisConfig JdbcConfig ServletConfig SpringMvcConfig 功能模塊 測試 業務層接口測試 控制層測試 SSM是Java Web開發中常用的三個主流框架組合的縮寫&#xff0c;分別對應Spring、Spring MVC、MyBatis…

P1042【深基8,例1】乒乓球

【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革&#xff0c;以推動乒乓球運動在全球的普及。其中 11 分制改革引起了很大的爭議&#xff0c;有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…

ubuntu24.04上使用qemu和buildroot模擬vexpress-ca9開發板構建嵌入式arm linux環境

1 準備工作 1.1 安裝qemu 在ubuntu系統中使用以下命令安裝qemu。 sudo apt install qemu-system-arm 安裝完畢后&#xff0c;在終端輸入: qemu- 后按TAB鍵&#xff0c;彈出下列命令證明安裝成功。 1.2 安裝arm交叉編譯工具鏈 sudo apt install gcc-arm-linux-gnueabihf 安裝之…

用 R 語言打造交互式敘事地圖:講述黃河源區生態變化的故事

目錄 ?? 項目背景:黃河源頭的生態變遷 ?? 技術棧介紹 ??? 最終效果預覽 ?? 項目構建步驟 1?? 數據準備 2?? 構建 Leaflet 地圖 3?? 使用 scrollama 實現滾動觸發事件 4?? 使用 R Markdown / Quarto 打包發布 ?? 效果展示截圖 ?? 完整代碼倉庫 …

CTF--秋名山車神

一、原網頁&#xff1a; 二、步驟&#xff1a; 1.嘗試用計算器計算&#xff1a; 計算器溢出&#xff0c;無法正常計算 2.使用python計算&#xff1a; 得出計算結果為&#xff1a;1864710043732437134701060769 3.多次刷新頁面&#xff1a; 發現變量為value&#xff0c;要用pos…

CRC實戰寶典:從原理到代碼,全面攻克循環冗余校驗

CRC實戰寶典&#xff1a;從原理到代碼&#xff0c;全面攻克循環冗余校驗 github開源&#xff1a;CRC軟硬件協同測試項目 CRC 簡介 CRC&#xff08;循環冗余校驗&#xff09;是一種強大的錯誤檢測技術&#xff0c;廣泛應用于數字網絡和存儲系統。它是確保數據完整性的重要方法…

【大模型】DeepSeek + Coze 打造個人專屬AI智能體使用詳解

目錄 一、前言 二、AI智能體介紹 2.1 什么是AI智能體 2.2 AI智能體核心能力 2.3 AI智能應用場景 三、coze 介紹 3.1 coze是什么 3.1.1 平臺概述 3.1.2 平臺適用人群 3.2 平臺核心功能 3.3 coze可以做什么 3.4 為什么選擇coze 四、coze 搭建AI智能體操作實踐 4.1 搭…

MySQL入門:數據表的創建

?今天我們來介紹一下除HTML外的另一種語言&#xff1a;MySQL語言&#xff1b; MySQL&#xff1a;即一種用于管理和處理關系數據庫的標準語言。要用于執行查詢、更新、管理數據庫中的數據以及定義和操作數據庫結構。 接下來我會逐一介紹它的作用以及其中數據表&#xff0c;數據…