貪心算法二

> 作者:?舊言~
> 座右銘:松樹千年終是朽,槿花一日自為榮。

> 目標:了解什么是貪心算法,并且掌握貪心算法。

> 毒雞湯:有些事情,總是不明白,所以我不會堅持。早安!

> 專欄選自:貪心算法_?舊言~的博客-CSDN博客

> 望小伙伴們點贊👍收藏?加關注喲💕💕

一、算法講解

貪心算法的定義:

貪心算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的局部最優解。貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無后效性,即某個狀態以前的過程不會影響以后的狀態,只與當前狀態有關。

解題的一般步驟是:

  1. 建立數學模型來描述問題;
  2. 把求解的問題分成若干個子問題;
  3. 對每一子問題求解,得到子問題的局部最優解;
  4. 把子問題的局部最優解合成原來問題的一個解。

如果大家比較了解動態規劃,就會發現它們之間的相似之處。最優解問題大部分都可以拆分成一個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,大部分情況下這是不可行的。貪心算法和動態規劃本質上是對子問題樹的一種修剪,兩種算法要求問題都具有的一個性質就是子問題最優性(組成最優解的每一個子問題的解,對于這個子問題本身肯定也是最優的)。

動態規劃方法代表了這一類問題的一般解法,我們自底向上構造子問題的解,對每一個子樹的根,求出下面每一個葉子的值,并且以其中的最優值作為自身的值,其它的值舍棄。而貪心算法是動態規劃方法的一個特例,可以證明每一個子樹的根的值不取決于下面葉子的值,而只取決于當前問題的狀況。換句話說,不需要知道一個節點所有子樹的情況,就可以求出這個節點的值。由于貪心算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。

二、算法習題


2.1、第一題

題目鏈接:409. 最長回文串 - 力扣(LeetCode)

題目描述:

算法思路:?盡可能多的字符去構造回?串

  1. 如果字符出現偶數個,那么全部都可以?來構造回?串;
  2. 如果字符出現奇數個,減去?個之后,剩下的字符能夠全部?來構造回?串;
  3. 最后再判斷?下,如果有字符出現奇數個,就把它單獨拿出來放在中間。

代碼呈現:

class Solution {
public:int longestPalindrome(string s) {// 1. 計數 - ?數組模擬哈希表int hash[127] = {0};for (char ch : s)hash[ch]++;// 2. 統計結果int ret = 0;for (int x : hash) {ret += x / 2 * 2;}return ret < s.size() ? ret + 1 : ret;}
};

2.2、第二題

題目鏈接:942. 增減字符串匹配 - 力扣(LeetCode)

題目描述:

??

算法思路:

  • 當遇到 'I' 的時候,為了讓下?個上升的數可選擇的「范圍更多」,當前選擇「最?」的那個數;
  • 當遇到 'D' 的時候,為了讓下?個下降的數可選擇的「范圍更多」,選擇當前「最?」的那個數。

代碼呈現:

class Solution {
public:vector<int> diStringMatch(string s) {int left = 0, right = s.size(); // ? left,right 標記最?值和最?值vector<int> ret;for (auto ch : s) {if (ch == 'I')ret.push_back(left++);elseret.push_back(right--);}ret.push_back(left); // 把最后?個數放進去return ret;}
};

2.3、第三題

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

題目描述:

??

算法思路:

先將兩個數組排序。針對胃?較?的孩?,從?到?挑選餅?:

  1. 如果當前餅?能滿?,直接喂(最?的餅?都能滿?,不要浪費?餅?);
  2. 如果當前餅?不能滿?,放棄這個餅?,去檢測下?個餅?(這個餅?連最?胃?的孩?都?法滿?,更別提那些胃??的孩?了)。

代碼呈現:

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {// 先排序sort(g.begin(), g.end());sort(s.begin(), s.end());// 利?雙指針找答案int ret = 0, n = s.size();for (int i = 0, j = 0; i < g.size() && j < n; i++, j++) {while (j < n && s[j] < g[i])j++; // 找餅?if (j < n)ret++;}return ret;}
};

2.4、第四題

題目鏈接:553. 最優除法 - 力扣(LeetCode)

題目描述:

??

算法思路:

  • 在最終的結果中,前兩個數的位置是?法改變的。
  • 因為每?個數的都是?于等于 2 的,為了讓結果更?,我們應該盡可能的把剩下的數全都放在「分?」上。

代碼呈現:

class Solution {
public:string optimalDivision(vector<int>& nums) {int n = nums.size();// 先處理兩個邊界情況if (n == 1) {return to_string(nums[0]);}if (n == 2) {return to_string(nums[0]) + "/" + to_string(nums[1]);}string ret = to_string(nums[0]) + "/(" + to_string(nums[1]);for (int i = 2; i < n; i++) {ret += "/" + to_string(nums[i]);}ret += ")";return ret;}
};

2.4、第五題

題目鏈接:45. 跳躍游戲 II - 力扣(LeetCode)

題目描述:

??

算法思路:

  • ?類似層序遍歷的過程,將第 i 次跳躍的「起始位置」和「結束位置」找出來,?這次跳躍的情況,更新出下?次跳躍的「起始位置」和「終?位置」。
  • 這樣「循環往復」,就能更新出到達 n - 1 位置的最?跳躍步數。

代碼呈現:

class Solution {
public:int jump(vector<int>& nums) {int left = 0, right = 0, maxPos = 0, ret = 0, n = nums.size();while (left <= right) // 保險的寫法,以防跳不到 n - 1 的位置{if (maxPos >= n - 1) // 先判斷?下是否已經能跳到最后?個位置{return ret;}// 遍歷當成層,更新下?層的最右端點for (int i = left; i <= right; i++) {maxPos = max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;ret++;}return -1; // 跳不到的情況}
};

2.6、第六題

題目鏈接:55. 跳躍游戲 - 力扣(LeetCode)

題目描述:

??

算法思路:

和 跳躍游戲II ?樣,僅需修改?下返回值即可。

代碼呈現:

class Solution {
public:bool canJump(vector<int>& nums) {int left = 0, right = 0, maxPos = 0, n = nums.size();while (left <= right) {if (maxPos >= n - 1) {return true;}for (int i = left; i <= right; i++) {maxPos = max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;}return false;}
};

三、結束語?

今天內容就到這里啦,時間過得很快,大家沉下心來好好學習,會有一定的收獲的,大家多多堅持,嘻嘻,成功路上注定孤獨,因為堅持的人不多。那請大家舉起自己的小手給博主一鍵三連,有你們的支持是我最大的動力💞💞💞,回見。

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

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

相關文章

react中的fiber和初次渲染

源碼中定義了不同類型節點的枚舉值 組件類型 文本節點HTML標簽節點函數組件類組件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…

Wireshark的OSPF報文抓包和分析(單區域ospf實驗)

一、OSPF的5種數據包和7種狀態機制 數據包 Hello&#xff1a;發現、建立鄰居&#xff08;鄰接&#xff09;關系、維持、周期保活&#xff1b;存在全網唯一的RID&#xff0c;使用IP地址表示 DBD&#xff1a;本地的數據庫的目錄&#xff08;摘要&#xff09;&#xff0c;LSDB的…

前后分離文件上傳案例,前端HTML,后端Net6開發的webapi(完整源代碼)下載

文件上傳功能在項目開發中非常實用&#xff0c;本案例前端用HTML頁面的form表單實現&#xff0c;后端用Net6實現。 前后分離文件上傳案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代碼&#xff09; 下載鏈接https://download.csdn.net/download/luckyext/9…

Linux之命令記錄【一】

文章目錄 前言幾個重要的熱鍵1.[Tab]按鍵2.[Ctrl]-c 按鍵3.[Ctrl]-d 按鍵4.[shift]{[PageUP]|[Page Down]}按鍵 線上求助&#xff08;查看幫助信息&#xff09;1. --help2.man page3.info page 用戶身份1.su 基礎指令1.date2.cal3.bc 系統字符集相關1.locale 文本編輯器1.nano …

Unity HDR顏色、基礎顏色、強度強度、HDR面板Intensity之間的相互轉換

目錄 前言&#xff1a; 一、UnityHDR面板的規律 二、HDR與基礎顏色轉換&#xff0c;HDR強度獲取&#xff0c;輸入設置強度獲取 1.基礎色->HDR顏色 2.HDR顏色->基礎色 3.獲取HDR顏色在面板中的強度 4.獲取HDR顏色在面板設置輸入時的強度 前言&#xff1a; HDR&#…

T41LQ專為人工智能物聯網(AIoT)應用設計,適用于智能安防、智能家居、機器視覺等領域 軟硬件資料+樣品測試

君正&#xff08;Ingenic&#xff09;T系列芯片涵蓋多個型號&#xff0c;每個型號根據不同應用需求提供了多個版本。以下是各型號及其主要版本&#xff1a; 1. T23系列&#xff1a; T23N&#xff1a;標準版&#xff0c;適用于移動攝像機、安全監控、視頻通話和視頻分析等應用…

高頻 SQL 50 題(基礎版)| 高級字符串函數 / 正則表達式 / 子句:1667. 修復表中的名字、1527. 患某種疾病的患者、196. 刪除重復的電子郵箱、176. 第二高的薪水、...

高級字符串函數 / 正則表達式 / 子句 1667. 修復表中的名字 題目鏈接&#xff1a;1667. 修復表中的名字 狀態&#xff1a;學會了 思路&#xff1a; 要求修復名字&#xff08;首字母大寫&#xff0c;其他字母小寫&#xff09;&#xff0c;按順序返回。 想法就是取出名字這一列&…

《異步江湖:XHR、Promise 與 Event Loop 的恩怨情仇》

XMLHttpRequest XMLHttpRequest&#xff08;簡稱 XHR&#xff09;是瀏覽器提供的一個 JavaScript 對象&#xff0c;用于在客戶端和服務器之間發送 HTTP 請求。它是實現 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09; 技術的核心工具&#xff0c;允許網頁在不…

C++課程設計【宿舍管理查詢軟件】

宿舍管理查詢軟件 一、題目描述二、源碼以及說明宿舍管理查詢軟件設計與實現1. 系統設計思路1.1 功能需求1.2 數據結構2. 系統實現3. 代碼說明3.1 數據結構3.2 功能實現3.3 文件存儲4. 示例運行輸入輸出5. 總結其他QT文章推薦一、題目描述 (一)問題描述 為宿舍管理人員編寫一…

MWC 2025 | 移遠通信推出AI智能無人零售解決方案,以“動態視覺+邊緣計算”引領智能零售新潮流

在無人零售市場蓬勃發展的浪潮中&#xff0c;自動售貨機正經歷著從傳統機械式操作向AI視覺技術的重大跨越。 移遠通信作為全球領先的物聯網整體解決方案供應商&#xff0c;精準把握行業趨勢&#xff0c;在2025世界移動通信大會&#xff08;MWC&#xff09;上宣布推出全新AI智能…

C語言常用的頭文件,include文件

常用頭文件功能速覽 1 &#xff0c;通用常用頭文件 01. stdio.h——標準輸入輸出 02. stdlib.h——內存管理與分配、隨機數、字符串轉換 03. string.h——字符串處理 04. math.h——數學 05. time.h——時間和日期 06. ctype…

[MySQL初階]MySQL(4)基本查詢

標題&#xff1a;[MySQL初階]MySQL&#xff08;4&#xff09;基本查詢 水墨不寫bug 文章目錄 一. 數據表設計二、對數據表的操作1. Create 操作&#xff08;插入數據&#xff09;查看最近受影響的行數&#xff1a; 2. Retrieve 操作&#xff08;讀取數據&#xff09;&#xff0…

小米智能音箱Pro搭載“超級小愛”,支持遠程控車

大家好,今天我要給大家好好嘮嘮小米智能音箱Pro,尤其是它搭載的“超級小愛”,那功能可太強大了,還支持遠程控車,真的是給我們的生活帶來了超多便利和驚喜。 先來說說這小米智能音箱Pro的外觀。它的設計非常簡約時尚,整體造型方方正正,線條流暢,放在家里任何一個角落都…

react中的useContext--為什么使用(一)

React 的數據傳遞流程 在 React 中&#xff0c;數據傳遞通常是自上而下的&#xff0c;也就是父組件把數據通過 props 傳遞給子組件&#xff0c;子組件無法直接修改父組件的數據。 例子&#xff1a;父組件向子組件傳遞數據 const Parent () > {const user { name: &quo…

如何使用 LLM 生成的術語自動在搜索應用程序上構建 autocomplete 功能

作者&#xff1a;來自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通過使用 LLM 生成的詞匯&#xff0c;為搜索應用增強自動補全功能&#xff0c;實現更智能、更動態的搜索建議。 自動補全是搜索應用中的一項關鍵功能&#xff0c;它通過在用戶輸入時實…

MAVEN手動配置(阿里云)全教程

介于網上各種各樣的MAVEN配置過程中方法大致相同卻細節參差不齊&#xff0c;我總結了我遇見的一些問題&#xff0c;來完全的解決MAVEN手動配置的全過程&#xff0c;以及分享解決小毛病的經驗。 所需材料&#xff1a; MAVEN3.9.9&#xff08;下載適合自己的版本即可&#xff09…

DeepSeek 3FS:端到端無緩存的存儲新范式

在 2025 年 2 月 28 日&#xff0c;DeepSeek 正式開源了其高性能分布式文件系統 3FS【1】&#xff0c;作為其開源周的壓軸項目&#xff0c;3FS 一經發布便引發了技術圈的熱烈討論。它不僅繼承了分布式存儲的經典設計&#xff0c;還通過極簡卻高效的架構&#xff0c;展現了存儲技…

HarmonyOS:如何將圖片轉為PixelMap并進行圖片緩存策略

前言&#xff1a;在HarmonyOS項目開發中&#xff0c;我們使用Ark-Ts語言開發項目。我們有個功能是拍照&#xff0c;除了正常顯示出來&#xff0c;并且上傳服務器。我在開發過程中&#xff0c;遇到的問題是&#xff0c;如果離開這個頁面再回到當前頁面仍要顯示圖片&#xff0c;那…

2025.3.9機器學習筆記:文獻閱讀

2025.3.9周報 一、文獻閱讀題目信息摘要Abstract創新點網絡架構實驗結論不足以及展望 一、文獻閱讀 題目信息 題目&#xff1a; Time-series generative adversarial networks for flood forecasting期刊&#xff1a; Journal of Hydrology作者&#xff1a; Peiyao Weng, Yu …

linux固定IP并解決虛擬機無法ping其他電腦問題

linux固定IP并解決虛擬機無法ping其他電腦問題 1.找到網卡文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 2.編輯文件信息 BOOTPROTO 這個dhcp改為static#添加以下內容IPADDR<你的IP地址>NETMASK<子網掩碼>&#xff0c;例如255.255.255.0。GATEWAY<網…