【貪心算法】day9

📝前言說明:

  • 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話);(4)貪心策略正確性的 “證明”
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

你可以點擊下方鏈接,進行其他貪心算法題目的學習

點擊鏈接開始學習
貪心day1貪心day2
貪心day3貪心day4
貪心day5貪心day6
貪心day7貪心day8
貪心day9貪心day10

也可以點擊下面連接,學習其他算法

點擊鏈接開始學習
優選專題動態規劃
遞歸、搜索與回溯貪心算法

題單獲取→ 【貪心算法】題單匯總

題目

  • 452. 用最少數量的箭引爆氣球
    • 個人解
  • 397. 整數替換
    • 優質解
      • 遞歸 + 記憶化搜索
      • 貪心
  • 354. 俄羅斯套娃信封問題
    • 優質解
      • 解法一(動態規劃)
      • 解法二(貪心)


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

題目鏈接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/
在這里插入圖片描述

個人解

思路:

  • 和前面的題目差不多

屎山代碼:

class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {// 同樣是合并區間,如果有重疊部分,則只需要一支箭// 按照右端點排序,我們射箭的時候往氣球的結束位置射更容易射中多個(貪心)int ans = 1, n = points.size(); // 第一個始終要一箭ranges::sort(points.begin(), points.end(), [&](vector<int>& p1, vector<int>& p2){return p1[1] < p2[1];});int left = points[0][0], right = points[0][1];for(int i = 1; i < n; i++){if(points[i][0] > right)  // 射前一個氣球的時候不能射到后一個氣球,要加箭{ans++;right = points[i][1];  // 更新下一只箭射的位置}}return ans;}
};

時間復雜度:O(nlogn)O(nlogn)O(nlogn)
空間復雜度:O(logn)O(logn)O(logn)


397. 整數替換

題目鏈接:https://leetcode.cn/problems/integer-replacement/description/
在這里插入圖片描述


優質解

遞歸 + 記憶化搜索

代碼:

class Solution {
private:unordered_map<long long, int> memo;int dfs(long long n) {  // 用long long避免溢出if (n == 1) return 0;if (memo.count(n)) return memo[n];int steps;if (n % 2 == 0) {steps = 1 + dfs(n / 2);} else {// 對于奇數,分別處理n-1和n+1的情況steps = 1 + min(dfs(n - 1), dfs(n + 1));}memo[n] = steps;return steps;}public:int integerReplacement(int n) {return dfs((long long)n);  // 轉換為long long再處理}
};

時間復雜度:O(logn)O(logn)O(logn)
空間復雜度:O(logn)O(logn)O(logn)

貪心

  • 我們把每個數寫成二進制的方式進行分析,同時/操作,變成二進制右移一位
  • 然后通過找局部最優解,發現"貪”的方法
    在這里插入圖片描述
    代碼:
class Solution {
public:int integerReplacement(long long n) {int ans = 0;while(n != 1){if (n % 2 == 0)n /= 2;else{if(n == 3 || (n & 3) == 1)n -= 1;elsen += 1;}ans++;}return ans;}
};

354. 俄羅斯套娃信封問題

題目鏈接:https://leetcode.cn/problems/russian-doll-envelopes/description/
在這里插入圖片描述


優質解

解法一(動態規劃)

思路:

  • 按左端點排序,此時只需要關注右端點
  • 因為要套娃 → 變成求最長遞增子序列問題(按右端點)

代碼:

class Solution {
public:int maxEnvelopes(vector<vector<int>>& env) {int n = env.size();ranges::sort(env);vector<int> dp(n, 1);int ans = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(env[j][1] < env[i][1] && env[j][0] < env[i][0]) // 因為會出現相同的左端點dp[i] = max(dp[j] + 1, dp[i]);}ans = max(ans, dp[i]);}return ans;}
};

時間復雜度:O(n2)O(n^2)O(n2),會超時

解法二(貪心)

  • 解法:重寫排序 + 貪心 + 二分
    因為本題需要考慮兩個端點,所以需要重寫排序(減少貪心時的分類討論)
  • 排序:左端點從小到大排,左端點相同時,右端點從大到小的順序排 → 變成完全的最長遞增子序列
  • 然后用貪心 + 二分的方式解決問題

代碼:

class Solution {
public:int maxEnvelopes(vector<vector<int>>& env) {int n = env.size();sort(env.begin(), env.end(), [&](vector<int> &a, vector<int> &b){return a[0] != b[0] ? a[0] < b[0] : a[1] > b[1];});vector<int> ret; // 存儲最長子序列ret.push_back(env[0][1]);for(int i = 1; i < n; i++){int b = env[i][1];if(b > ret.back()) ret.push_back(b);else{int left = 0, right = ret.size() - 1;while(left < right){// 找到第一個 > b 的數int mid = (left + right) >> 1;if(ret[mid] < b) left = mid + 1; // <=b 可以全部排除else right = mid;}ret[left] = b;}}return ret.size();}
};

時間復雜度:O(nlogn)O(nlogn)O(nlogn)


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

linux C 語言開發 (八) 進程基礎

文章的目的為了記錄使用C語言進行linux 開發學習的經歷。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; linux C 語言開發 (一) Window下用gcc編譯和gdb調試 linux C 語言開發 (二) VsCode遠程開發 linux linux C 語言開發 (…

從零學算法1094

1094.拼車 車上最初有 capacity 個空座位。車 只能 向一個方向行駛&#xff08;也就是說&#xff0c;不允許掉頭或改變方向&#xff09; 給定整數 capacity 和一個數組 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…

B2B企業營銷型AI Agent服務商推薦:誰更專業?如何選型?

一、引言&#xff1a;為什么B2B企業需要營銷型AI Agent&#xff1f;在當前競爭激烈的B2B市場中&#xff0c;企業普遍面臨幾大挑戰&#xff1a;線索獲取難&#xff1a;獲客成本持續上升&#xff0c;高質量線索難以篩選。銷售周期長&#xff1a;從初步接觸到簽單&#xff0c;往往…

算法-雙指針5.6

目錄 &#x1f33f;力扣611-有效三角形得個數 &#x1f9ca;題目鏈接&#xff1a;https://leetcode.cn/problems/valid-triangle-number/description/ &#x1f9ca;題目描述&#xff1a;?編輯 &#x1f9ca;解題思路&#xff1a; &#x1f9ca;解題代碼&#xff1a; &a…

超參數自動化調優指南:Optuna vs. Ray Tune 對比評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;從"手動煉丹"到"自動化…

軟考-局域網基礎考點總結

這篇文章用于整理軟考網絡相關的知識點&#xff0c;囊括了詳細的局域網基礎的考點&#xff0c;能夠讓你認真備考&#xff0c;基礎知識一網打盡&#xff0c;讓后續的學習更加通暢~ 第一部分&#xff1a;OSI七層參考模型 OSI(Open System Interconnection)模型是一個理論框架&am…

Node.js核心模塊介紹

1. fs 模塊fs&#xff08;File System&#xff09;模塊允許對文件系統進行操作&#xff0c;提供了文件讀寫、文件夾操作等功能。fs 支持同步和異步兩種 API。1.1. 常用方法讀取文件&#xff1a;異步: fs.readFile()同步: fs.readFileSync()寫入文件&#xff1a;異步: fs.writeF…

緩存三大劫攻防戰:穿透、擊穿、雪崩的Java實戰防御體系(二)

第二部分&#xff1a;緩存擊穿——熱點key過期引發的“DB瞬間高壓” 緩存擊穿的本質是“某個熱點key&#xff08;高并發訪問&#xff09;突然過期”&#xff0c;導致大量請求在同一時間穿透緩存&#xff0c;集中沖擊DB&#xff0c;形成“瞬間高壓”。 案例3&#xff1a;電商秒殺…

Linux相關概念和易錯知識點(45)(網絡層、網段劃分)

目錄1.網絡層&#xff08;1&#xff09;IP協議頭格式&#xff08;2&#xff09;工作流程2.網段劃分&#xff08;1&#xff09;五類地址&#xff08;2&#xff09;回環地址&#xff08;3&#xff09;網段的特殊地址&#xff08;4&#xff09;網絡建設我們前面暫時跳過了網絡層&a…

transition(過渡)和animation(動畫)——CSS

1.transition過渡可以為一個元素在不同狀態之間進行切換時添加過渡效果&#xff0c;實現不同狀態間的變化效果。通過觸發事件(鼠標懸停、點擊等)&#xff0c;在兩個狀態間切換。1.1 使用語法&#xff1a;transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud項目國產化改造MySQL遷移達夢數據庫,SQL變更

達夢數據庫下載地址&#xff1a;https://eco.dameng.com/download 達夢數據庫安裝文檔&#xff1a;https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 數據遷移SQLark工具使用 首先&#xff0c;本次MySQL遷移使用了SQLark工具 1.下載安裝SQLark https…

Cesium---1.133版本不修改源碼支持arcgis MapServer 4490切片

參照了這篇博文&#xff1a;https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源碼進行了修改&#xff0c;可以實現服務加載&#xff1a; Event.js import { Check,defined} from &qu…

迭代器和生成器的區別與聯系

目錄 1.可迭代對象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函數 vs 生成器表達式 4.三者之間的聯系與區別 5.關系圖&#xff08;幫助你一眼看懂&#xff09; 6.核心結論&#xff08;記住這三句話&#xff09; 1.可迭代對象 (Iterable) 定義&…

Dropout:深度學習中的隨機丟棄正則化技術

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度學習中最廣泛使用的正則化…

vue2遷移到vite[保姆級教程]

vue2遷移到vite[保姆級教程]使用vue CLI創建項目進行vite遷移詳細步驟1. 安裝 Vite 和 Vue 2 支持插件2. 創建 vite.config.js3. 修改 package.json 腳本4. 創建 index.html5. 確保 main.js 正確引入6. 處理靜態資源7. 構建優化&#xff08;可選&#xff09;8. 啟動項目常見問題…

瀏覽器輸入URL回車

一&#xff0c;URL解析瀏覽器會對輸入的 URL&#xff08;統一資源定位符&#xff09; 進行拆解&#xff0c;搞清楚 “目標是誰、要獲取什么資源https://www.baidu.com/s?wdCDN 拆解后&#xff1a;協議&#xff08;Scheme&#xff09;&#xff1a;https&#xff08;加密通信協議…

leedcode 算法刷題第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

計算機網絡(二)物理層數據鏈路層

&#xff08;物理層、數據鏈路層... 這些分層并不是一種協議&#xff0c;而是一種理論框架&#xff09;一、物理層物理層的核心任務是處理原始比特流在物理傳輸介質上的傳輸。 主要任務物理層的主要任務可以概括為以下幾點&#xff0c;它們是確保數據能在網絡硬件間可靠傳輸的基…

android13修改WiFi掃描二維碼識別識別成功率不高的問題

Android13 Setting掃描二維碼主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依賴 QrCamera 類。QrCamera 使用了 Camera1 的API。開發了新類 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一個新的二維碼掃描的處理類&#…

AI賦能與敏捷融合:未來電源項目管理者的角色重塑與技能升級——從華為實戰看高技術研發項目的管理變革

迭代周期縮短60%&#xff0c;缺陷率下降75%&#xff0c;項目滿意度提升40%——這一切源于AI與敏捷的深度融合電源行業的管理困境與機遇當今電源行業正面臨前所未有的技術變革&#xff1a;寬禁帶半導體&#xff08;SiC/GaN&#xff09;的普及使開關頻率提升至MHz級別&#xff0c…