算法第23天|貪心算法:基礎理論、分發餅干、擺動序列、最大子序和

今日總結:

? ? ? ? 擺動序列的三種特殊情況需要著重思考,感覺是沒有思考清楚

基礎理論

? ? ? ? 1、貪心的本質:

? ? ? ? ? ? ? ? 貪心的本質是選擇每一階段的局部最優,從而達到全局最優。

? ? ? ? ? ? ? ? 例如:一堆鈔票,只能拿走10張,如何拿走最多的金額?:每次拿最大的(局部最優),最后就是拿走最多的金額(全局最優)

? ? ? ?2、 貪心的套路:

? ? ? ? ? ? ? ? 貪心算法沒有固定的套路。

? ? ? ? ? ? ? ? 難點:如何通過局部最優推理出全局最優(也沒有具體的套路)

? ? ? ? ? ? ? ? 如何驗證可不可以使用貪心算法:

? ? ? ? ? ? ? ? ? ? ? ? 舉反例,如果想不到反例就可以嘗試使用貪心算法

? ? ? ? 3、貪心的一般解題思路(雞肋,實際做題不能按照這個考慮):

? ? ? ? ? ? ? ? (1)將問題分解為若干個子問題

? ? ? ? ? ? ? ? (2)找出適合的貪心策略

? ? ? ? ? ? ? ? (3)求解每一個子問題的最優解

? ? ? ? ? ? ? ? (4)將局部最優解堆疊成全局最優解

? ? ? ? ? ? ? ? 實際做題中,只需要考慮局部最優是什么,如何推導出全局最優

分發餅干

題目鏈接:455. 分發餅干 - 力扣(LeetCode)

總體思路:

? ? ? ? 將每一塊餅干都能夠給到適合的孩子,就能達到盡可能多的孩子。

? ? ? ? 所以,將餅干從小到大排序, 對孩子的胃口值也從小到大排序,盡量將每一塊小餅干都能分給對應的小孩子。

總體代碼:

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {//對兩者都進行排序sort(g.begin(),g.end());sort(s.begin(),s.end());//一個記錄分配的變量int sum=0;//遍歷餅干,從最小的胃口值開始分配for(int i=0,j=0;j<s.size();j++){if(i<g.size()&&s[j]>=g[i]){//滿足胃口值,滿足局部最合適,進行下一個孩子,同時記錄i++;sum++;}}return sum;}
};

擺動序列

題目鏈接:376. 擺動序列 - 力扣(LeetCode)

總體思路:

? ? ? ? 1、首先理解擺動序列的含義:連續數字之間的差嚴格的在正數和負數之間交替,則這個數字序列稱為擺動序列,少于兩個元素的序列也是擺動序列。

? ? ? ? 2、目標:

? ? ? ? ? ? ? ? (1)現在給定的序列是一個未知的序列:

? ? ? ? ? ? ? ? (2)需要通過刪除最少的元素去獲得最大的擺動序列,

? ? ? ? ? ? ? ? (3)且不能改變元素的原本位置。

? ? ? ? 3、方法:貪心算法:通過局部最優推導全局最優

? ? ? ? ? ? ? ? (1)局部最優:刪除單調坡度上的節點(頂、谷不刪除),那么這個坡度就有兩個局部峰值。

? ? ? ? ? ? ? ? (2)全局最優:整個序列擁有最多的局部峰值--->達到最長的擺動序列

? ? ? ? 4、尋找峰值情況的討論

? ? ? ? ? ? ? ? (1)上下坡中有平坡

? ? ? ? ? ? ? ? ? ? ? ? 需要刪除(不統計)平坡的前邊,只保留最后一個峰或者谷[i]-[i-1]<=0&&[i+1]-[i]>0或者[i]-[i-1]>=0&&[i+1]-[i]<0才記錄

? ? ? ? ? ? ? ? (2)數組首尾兩端的記錄方法

? ? ? ? ? ? ? ? ? ? ? ? 因為現在討論的是通過當前的點與上一個點、下一個點的差獲得當前是不是峰谷,所以對于數組首尾的特殊(首沒有前一個元素,尾沒有下一個元素),可以通過假設數組前還有一個與首相同的元素,即默認峰值是1開始計算。

? ? ? ? ? ? ? ? ? ? ? ? 相當于提前記錄一個左邊的端點,去記錄的第二個值是左端點與右端點的峰,沒有記錄右端點

? ? ? ? ? ? ? ? (3)單調坡中有平坡

? ? ? ? ? ? ? ? ? ? ? ? 在第(1)種中討論了上下坡中有平坡,處理方法是不去記錄前邊平的位置,但是在單調的坡中如果有平坡,可能會記錄上平坡的右邊位置,導致位置變多,所以需要在每次獲取到當前位置的左右坡度后,需要將左邊的坡度=右邊的坡度,在下次計算的時候就會處理掉單調坡有平坡的現象。

? ? ? ? ? ? ? ? ? ? ? ? 相當于只記錄峰值變化,只要沒有出現峰值,就不去記錄,也就是將前一個峰值的坡度記錄下來,只要當前坡度不相反,就不去記錄。

總體代碼:

class Solution {
public://核心尋找局部最優,即不記錄坡度中的值,只記錄峰值//需要注意三點://(1)坡度有平坡的現象//(2)對于起始與結束的位置(因為要三個點比較)//(3)對于單調的坡中存在平坡現象int wiggleMaxLength(vector<int>& nums) {int length =1;//記錄長度,從1開始,因為除去起始位置的默認坡度int pre=0;int cur=0;//定義當前的坡度for(int i=0;i<nums.size()-1;i++)//因為默認左端點前有一個與左端點一樣的值,不去記錄右端點的位置了{   //使用cur去更新pre,從而避免單調坡中出現平坡的問題if(nums.size()<1)return length;//記錄當前的坡度cur = nums[i+1]-nums[i];if((pre<=0&&cur>0)||(pre>=0&&cur<0)){length++;//更新前一個坡度,只有在記錄峰值的時候才會更新坡度,不是每次計算cur都更新前一個的坡度pre = cur;}}return length;}
};

最大子序和

題目鏈接:53. 最大子數組和 - 力扣(LeetCode)

總體思路:

? ? ? ? 序列中存在正數、負數,求這個序列中的連續的子序列最大的和:所以要著重注意負數的影響,因為正數總是將和增大,負數會將和減小?

? ? ? ? 如果從某個值開始的子序列的和為負數了:說明當前值是一個負數,且與之前子序列的和加起來都要小于0,這個數只會影響整體的和,所以直接跳過當前的這個負數,從下一個值重新記錄子序列的和。

? ? ? ? 但是如果只是加上一個小的負數,整體結果仍舊大于0,不能重新開始記錄,因為后邊如果有大的正數,會使整體子序列的和變得更大。

? ? ? ? 所以,只有當前子序列的和為負數的時候,才從當前值的下一個值開始記錄子序列的和,也就是貪心思想,局部的最大,推導出全局的最大。

總體代碼:

class Solution {
public://最大和肯定和負值有關系,因為正值只會增加和//當目前的和小于0,就要舍棄,從新計算連續子序列的和(當前負數比之前所有的數之和都小,一定不能帶這個負數,不如后邊的自己相加)int maxSubArray(vector<int>& nums) {int sum = INT_MIN;//記錄最大的和int cur_sum = 0;//記錄當前的和for(int i=0;i<nums.size();i++){cur_sum += nums[i];//判斷當前的子序列的和是不是大于sumsum = sum >cur_sum?sum : cur_sum;if(cur_sum<0) cur_sum=0;}return sum;}
};

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

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

相關文章

Q-chunking——帶有動作分塊的強化學習:基于人類演示,進行一定的連貫探索(且可做到無偏的n步價值回溯)

前言 我在之前的文章中提到過多次&#xff0c;長沙具身團隊是我司建設的第二支具身團隊&#xff0c;通過5月份的全力招聘&#xff0c;為了沖刺6月底和7月初來長沙辦公室考察的第一批客戶&#xff0c;過去一個多月來&#xff0c;長沙分部(一開始就5人&#xff0c;另外5人 實習…

NW956NW961美光固態閃存NW964NW968

美光固態閃存深度解析&#xff1a;NW956、NW961、NW964與NW968的全方位評測一、產品概述與市場定位在當今數據爆炸的時代&#xff0c;固態硬盤&#xff08;SSD&#xff09;作為存儲領域的佼佼者&#xff0c;其性能與穩定性成為了用戶關注的焦點。美光&#xff08;Micron&#x…

C++修煉:IO流

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

語音識別的速度革命:從 Whisper 到 Whisper-CTranslate2,我經歷了什么?

Whisper-CTranslate2&#xff1a;語音識別的速度革命 大家好&#xff0c;一個沉迷于 AI 語音技術的 “音頻獵人”。最近在處理大量播客轉錄項目時&#xff0c;我被傳統語音識別工具折磨得苦不堪言 ——RTX 3090 跑一個小時的音頻要整整 20 分鐘&#xff0c;服務器內存分分鐘爆滿…

JVM 內存模型詳解:GC 是如何拯救內存世界的?

JVM 內存模型詳解&#xff1a;GC 是如何拯救內存世界的&#xff1f; 引言 Java 虛擬機&#xff08;JVM&#xff09;是 Java 程序運行的基礎&#xff0c;其核心特性之一就是自動內存管理。與 C/C 不同&#xff0c;Java 開發者無需手動分配和釋放內存&#xff0c;而是由 JVM 自動…

分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么選?

在黑馬點評項目實戰中&#xff0c;關于全局唯一ID生成的實現方案選擇中&#xff0c;我看到有人提到了雪花算法&#xff0c;本文就來簡單了解一下雪花算法與Redis的incr方案的不同。在分布式系統開發中&#xff0c;“全局唯一ID”是繞不開的核心問題。無論是分庫分表的數據庫設計…

(新手友好)MySQL學習筆記(完):事務和鎖

事務和鎖事務transaction&#xff0c;一組原子性的SQL查詢&#xff0c;或者說是一個獨立的工作單元。如果能夠成功執行這組查詢的全部語句&#xff0c;就會執行這組查詢&#xff1b;如果其中任何一條語句無法成功執行&#xff0c;那么這組查詢的所有語句都不會執行。也就是說&a…

【CMake】使用 CMake 將單模塊 C 項目構建為庫并鏈接主程序

目錄1. 項目結構設計&#x1f4e6; 結構說明2. 項目文件內容2.1 頂層 CMakeLists.txt2.2 模塊 src/color/CMakeLists.txt ?【推薦寫法】?是否需要寫 project()&#xff1f;2.3 模塊頭文件 include/color.h2.4 模塊實現文件 src/color/color.c2.5 主程序 src/main.c3. 構建與運…

從零開始的云計算生活——番外4,使用 Keepalived 實現 MySQL 高可用

目錄 前言 一、架構原理? ?Keepalived 作用? ?MySQL 主從復制? 二、環境準備? 服務器要求?&#xff1a; 安裝基礎軟件? 三、配置 MySQL 主從復制 四、配置 Keepalived 主節點配置?&#xff08;/etc/keepalived/keepalived.conf&#xff09; 從節點配置 五、…

list類的常用接口實現及迭代器

目錄 1. list類的介紹 2.list類的常用接口 2.1 list類的常用構造 2.2 list類對象的容量操作 2.3 list迭代器 2.4 list類的常用操作 3.list的模擬實現 1. list類的介紹 list代表的是雙向鏈表&#xff0c;常見的有創建&#xff0c;增&#xff0c;刪&#xff0c;改幾個接口…

vscode Cline接入火山引擎的Deepseek R1

創建火山引擎Deepseek R1的API 在火山引擎管理控制臺中創建Deepseek R1推理接入點&#xff08;大模型&#xff09;&#xff0c;創建成功后會看到下圖效果。在操作中選擇API調用&#xff0c;在頁面中選擇OpenAI SDK&#xff0c;按照步驟找到baseUrl地址和API_KEY&#xff0c;后續…

新手向:自動化圖片格式轉換工具

大家好&#xff01;今天我要分享一個非常實用的Python小工具——圖片格式批量轉換器。如果你經常需要處理大量不同格式的圖片文件&#xff0c;或者需要統一圖片格式以便于管理&#xff0c;那么這個工具將會成為你的得力助手&#xff01;一、為什么需要圖片格式轉換&#xff1f;…

CUDA中的內存管理、鎖頁內存、UVA統一虛擬地址、零拷貝、統一內存

文章目錄0 前言1 swap內存跟鎖頁內存2 UVA(Unified Virtual Addressing)統一虛擬地址3 先看最普通的cuda內存分配、釋放、傳輸4 申請鎖頁內存4.1 cudaHostAllocDefault4.2 cudaHostAllocPortable4.3 cudaHostAllocWriteCombined4.3 cudaHostAllocMapped4.4 幾種鎖頁內存總結4.5…

微服務環境下的灰度發布與金絲雀發布實戰經驗分享

微服務環境下的灰度發布與金絲雀發布實戰經驗分享 在大規模微服務架構中&#xff0c;如何平滑安全地上線新功能是每個后端團隊的痛點。本文將結合生產環境中的真實案例&#xff0c;分享灰度發布&#xff08;Gray Release&#xff09;與金絲雀發布&#xff08;Canary Release&am…

MEF 在 WPF 中的簡單應用

MEF核心筆記MEF 的開發模式主要適用于插件化的業務場景中&#xff0c;C/S 和 B/S 中都有相應的使用場景&#xff0c;其中包括但不限于 ASP.NET MVC 、ASP WebForms、WPF、UWP 等開發框架。當然&#xff0c;DotNet Core 也是支持的。 以下是搜索到一些比較好的博文供參考&#…

Gitlab跑CICD的時候,maven鏡像和pom.xml使用的maven版本沖突導致沒辦法build成功的解決方法

是這樣的&#xff01;最近遇到一個非常棘手的難題&#xff0c;我搞了大概2周時間才把他弄出來&#xff0c;因為自己搭了個私服的maven倉庫&#xff0c;他不像maven官方倉庫一樣&#xff0c;可以跟nginx一樣轉的&#xff0c;所以遇到好幾個難點&#xff01;第一點&#xff1a;就…

Linux內核IPv4路由查找:LPC-Trie算法的深度實踐

在互聯網基礎設施的核心領域,路由查找性能直接決定了網絡轉發效率。Linux內核作為現代網絡系統的基石,其IPv4路由子系統采用了一種名為LPC-Trie(Level-Compressed Trie) 的創新數據結構,在net/ipv4/fib_trie.c文件中實現了高效的路由管理方案。本文將深入剖析這一機制的設…

【設計模式】裝飾(器)模式 透明裝飾模式與半透明裝飾模式

裝飾模式&#xff08;Decorator Pattern&#xff09;詳解一、裝飾模式簡介 裝飾模式&#xff08;Decorator Pattern&#xff09; 是一種 結構型設計模式&#xff0c;它允許你動態地給對象添加行為或職責&#xff0c;而無需修改其源代碼&#xff0c;也不需要使用繼承來擴展功能。…

NAT原理與實驗指南:網絡地址轉換技術解析與實踐

NAT實驗 NAT&#xff08;Network Address Translation&#xff0c;網絡地址轉換&#xff09;&#xff1a; NAT技術的介紹&#xff1a; 隨著Internet用戶的快速增長&#xff0c;以及地址分配不均等因素&#xff0c;IPv4地址&#xff08;約40億的空間地址&#xff09;已經陷入不…

設計模式之【觀察者模式】

目錄 觀察者模式中的角色 通過一個簡單案例來演示觀察者模式 被觀察者接口 事件類型 up主類作為被觀察者 觀察者接口 粉絲類作為觀察者 測試 測試結果 觀察者模式中的角色 被觀察者(observable)觀察者(observer) 通過一個簡單案例來演示觀察者模式 被觀察者接口 /*…