貪心算法及相關例題

目錄

什么是貪心算法?

leetcode455題.分發餅干

leetcode376題.擺動序列

leetcode55題.跳躍游戲I

leetcode45題.跳躍游戲II

leetcode621題.任務調度器

leetcode435題.無重疊空間

leetcode135題.分發糖果


什么是貪心算法?

貪心算法更多的是一種思想,沒什么套路。

貪心:顧名思義,貪心就是只顧眼前的利益。只關注局部最優解,當前狀態的最優解,不關注最后全局最優解。

舉個正面例子:從不同面額的人民幣中選十張,怎么選金額最大?貪心算法就會每次都選100元面額的人民幣,選十張后得到的金額剛好也是全局最優解。

舉個反面例子:有一個承重10斤的包,有五個石頭,重量分別是7、4、5、4、2斤,怎樣放才能讓背包利用率最大?貪心算法就會每次都選最大的,先是7斤,然后再選2斤,總共利用了9斤。而全局最優的解法應該是:4 + 4 + 2 = 10斤。所以貪心算法不一定是最優解。

我們學貪心算法是希望能夠通過局部最優解推算出全局最優解。我們有什么套路呢?答案是沒有。對于一道題你無法用套路來推算能否用貪心算法做,我們只能靠直覺+自己多做題,通過刷題來掌握常見的貪心算法題。面試時貪心考的不多,我們重點掌握七八道核心題就可以了。

leetcode455題.分發餅干

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

思路:我們可以把小尺寸的餅干盡可能地給胃口小的孩子,或者大尺寸餅干盡量給胃口大的孩子。?

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);//按照胃口大小給孩子們排序Arrays.sort(s);//按照餅干尺寸給餅干排序//長度int n = g.length;//孩子個數int m = s.length;//餅干個數int res = 0;//存放結果//遍歷餅干,把小尺寸餅干給小胃口的孩子for(int i = 0; res < n && i < m; i++){//如果餅干尺寸大于等于孩子的胃口if(s[i] >= g[res]){res++;//那就下一個孩子}}return res;//時間復雜度:nlogn+mlogm 空間復雜度O(1)}
}

leetcode376題.擺動序列

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

class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length == 1) return nums.length;int res = 1;//防止最后一個峰值丟失int pre = 0;//保存前一個峰值是正是負int cur = 0;//保存當前差值for(int i = 0; i < nums.length - 1; i++){cur = nums[i + 1] - nums[i];if(pre <= 0 && cur > 0 || pre >= 0 && cur < 0){res++;pre = cur;}}return res;}
}

leetcode55題.跳躍游戲I

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

?1)如果從當前位置可以跳到位置i,表示i之前的所有位置我們都能到達。

2)我們要盡可能地跳的遠一點。

3)判斷自己能否到達最后一個位置。

class Solution {public boolean canJump(int[] nums) {int max = 0;//我們能跳到的最遠的位置for(int i = 0; i < nums.length; i++){if(max < i){return false;//連i這個位置都到不了}max = Math.max(max, i + nums[i]);}return true;}
}

leetcode45題.跳躍游戲II

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

?

class Solution {public int jump(int[] nums) {int start = 0;int end = 0;int res = 0;int max = 0;//能夠跳躍的最遠的位置while(end < nums.length){if(max >= nums.length - 1) return res;for(int i = start; i <= end; i++){max = Math.max(max, i + nums[i]);           }res++;start = end + 1;//表示下一次跳躍的起始位置end = max;//end是當前能跳躍的最遠的位置}return res;}
}

leetcode621題.任務調度器

621. 任務調度器 - 力扣(LeetCode)

?

class Solution {public int leastInterval(char[] tasks, int n) {//找出出現次數最多的字母int []arr = new int[26];int k = 0;//假設出現次數最多的字母有k種for(int i = 0; i < tasks.length; i++){arr[tasks[i] - 'A']++;//第 i 個元素的 ASCII 碼減去字符 'A' 的 ASCII 碼,得到的結果作為索引值//計算出該字母與字母 'A' 之間的偏移量。然后,這個偏移量被用作索引值}int max = 0;for(int i = 0; i < 26; i++){max = Math.max(max, arr[i]);}for(int i = 0; i < 26; i++){if(arr[i] == max){k++;}}//間隔夠插和不夠插中的最大值max = Math.max(((max - 1)*(n + 1) + k), tasks.length);return max;}
}

leetcode435題.無重疊空間

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

?

class Solution {//轉化問題-——>保存最大的區間數量使得區間不重疊//我們要留下在不重疊的情況下,右邊界比較小的區間//步驟:對數組排序,以第二個元素排序//    之后遍歷數組,遇到不重疊的就選擇留下來public int eraseOverlapIntervals(int[][] intervals) {if(intervals.length <= 1) return 0;//Arrays.sort() 方法的第二個參數是一個比較器(Comparator)//對二維數組 intervals 按照每個子數組的第二個元素進行升序排序。/*當我們使用如 Arrays.sort() 這樣的方法進行排序時,元素的實際交換操作是在單獨的排序算法(如快速排序、歸并排序等)中進行的,而比較器僅負責提供元素之間的相對順序信息。這些排序算法會根據比較器的返回值來更新元素間的相對順序,并在適當的時候實際交換元素的位置,最終得到一個有序序列。 */Arrays.sort(intervals, new Comparator<int[]>(){//重寫comparepublic int compare(int[] s1, int[] s2){return s1[1] - s2[1];}});int max = 1;//表示當前已經選擇的不重疊區間的數量int right = intervals[0][1];for(int i = 1; i < intervals.length; i++){if(intervals[i][0] >= right){max++;right = intervals[i][1];}}return intervals.length - max;}
}

leetcode135題.分發糖果

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

?

class Solution {public int candy(int[] ratings) {//孩子糖數受左右兩邊相鄰的孩子影響/*左規則:如果只受左邊孩子的影響,比左邊的孩子分數高就比左邊的孩子多獲得一個糖果右規則:如果只受右邊孩子影響,比右邊孩子的分數高就多獲得一個糖果整體結合左右規則來看,就在判斷每個孩子的糖果數中取兩個規則中的較大數       */int[] left = new int[ratings.length];int[] right = new int[ratings.length];//填充左規則left[0] = 1;for(int i = 1; i < ratings.length; i++){if(ratings[i] > ratings[i - 1]){left[i] = left[i - 1] + 1;}else{left[i] = 1;}}//填充右規則right[ratings.length - 1] = 1;for(int i = ratings.length - 2; i >= 0; i--){if(ratings[i] > ratings[i + 1]){right[i] = right[i + 1] + 1;}else{right[i] = 1;}}int res = 0;for(int i = 0; i < ratings.length; i++){int max = Math.max(left[i], right[i]);res += max;}return res;}
}

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

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

相關文章

《QT從基礎到進階·三十七》QWidget實現左側導航欄效果

NavigationBarPlugin插件類實現了對左側導航欄的管理&#xff0c;我們可以在導航欄插件中添加界面&#xff0c;并用鼠標點擊導航欄能夠切換對應的界面。 源碼在文章末尾 實現效果如下&#xff1a; NavigationBarPlugin實現的接口如下&#xff1a; class NAVIGATIONBAR_EXP…

【brpc學習實踐六】backup request場景案例

應用場景 有時為了保證可用性,需要同時訪問兩路服務,哪個先返回就取哪個。在brpc中,這有多種做法,根據server是否掛在同一個命名服務內有所區別。 當后端server可以掛在一個命名服務內時 Channel開啟backup request。這個Channel會先向其中一個server發送請求,如果在Ch…

C#,數值計算——插值和外推,多項式插值與外推插值(Poly_interp)的計算方法與源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 多項式插值與外推插值 /// Polynomial Interpolation and /// Extrapolation interpolation routines for one dimension /// </summary> public class Poly…

【ES6.0】- Promise對象

【ES6.0】- Promise對象 文章目錄 【ES6.0】- Promise對象一、概述二、Promise狀態三、Promise方法3.1 Promise.prototype.then方法&#xff1a;鏈式操作3.2 Promise.prototype.catch方法&#xff1a;捕捉錯誤3.3 Promise.race方法&#xff1a;捕捉錯誤3.4 Promise.any()3.5 Pr…

第三節-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中&#xff0c;系統提供的服務被包裝成一個個系統級service&#xff0c;這些service往往會在設備啟動之時添加進Android系統&#xff0c;當某個應用想要調用系統某個服務的功能時&#xff0c;往往是向系統發出請求&#xff0c;調用該服務的外部接口。在上一節…

廣告機/商業顯示屏_基于MT878安卓主板方案

安卓主板在廣告機領域扮演著重要的角色。無論是在商場、車站、酒店、電梯、機場還是高鐵站&#xff0c;LED廣告機廣泛應用&#xff0c;并通過不同方式進行播放和管理。 廣告機/商業顯示屏_基于MT878安卓主板方案 基于MT8788安卓主板方案的廣告機采用了聯發科MT8788八核芯片方案…

對比兩個數組中對應位置的兩個元素將每次對比的最大值用于構成新的數組np.maximum()

【小白從小學Python、C、Java】 【計算機等考500強證書考研】 【Python-數據分析】 對比兩個數組中對應位置的兩個元素 將每次對比的最大值用于構成新的數組 np.maximum() 選擇題 以下代碼的輸出結果為&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

Axios 默認配置 簡化URL 簡化代碼 多臺服務器接口配置

main.js配置 import Axios from axios Axios.defaults.method GET//設置默認的請求類型 Axios.defaults.baseURL https://apis.jxcxin.cn/api//設置接口地址 Axios.defaults.params { token: abc } //每次請求都帶上這個參數 Axios.defaults.timeout 5000 //請求的超時時間…

MATLAB - text的兩種使用方法

text小技巧 1. 常規使用&#xff08;Method 1&#xff09;2. 在顯示畫面的相對位置&#xff08;Method 2&#xff09;3. 舉個例子 1. 常規使用&#xff08;Method 1&#xff09; text(x,y,txt)2. 在顯示畫面的相對位置&#xff08;Method 2&#xff09; text(string,‘ABC’,…

使用websocket獲取thingsboard設備的實時數據

背景 有一個讀者前來咨詢,如何實時獲取設備的遙測數據。 其實tb是有提供websocket接口來獲取設備數據的。而且還支持js跨域調用。下面給大家演示一下。 websocket地址 完整代碼 <!DOCTYPE HTML> <html><h

HTTP協議和WebSocket協議之間的區別

HTTP協議和WebSocket協議之間的主要區別在于它們的設計目的和通信方式。 HTTP協議是一種無狀態的協議&#xff0c;它的主要設計目的是用于從Web服務器傳輸超文本到本地瀏覽器的傳輸協議。HTTP協議使用請求和響應模型&#xff0c;客戶端向服務器發送請求&#xff0c;服務器返回…

【Java并發編程十二】線程池

線程池 用來統一地管理線程&#xff0c;避免線程的重復創建與銷毀。使用線程池可以讓執行完的線程回到線程池&#xff0c;等待下一次調用。 import jdk.jshell.EvalException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import j…

Matplotlib顏色條的配置_Python數據分析與可視化

Matplotlib顏色條配置 基本顏色顏色條選擇配色方案顏色條刻度的限制與擴展功能的設置離散型顏色條 基本顏色 Matplotlib提供了8種指定顏色的方法&#xff1a; 在[0&#xff0c;1]中的浮點值的RGB或RGBA元組&#xff08;例如 (0.1, 0.2, 0.5) 或&#xff08;0.1&#xff0c; 0.…

C語言中文網 - Shell腳本 - 9

第1章 Shell基礎(開胃菜) 9. Shell修改命令提示符 Shell 通過PS1和PS2這兩個環境變量來控制提示符的格式,修改PS1和PS2的值就能修改命令提示符的格式。 PS1 控制最外層的命令提示符格式。 PS2 控制第二層的命令提示符格式。 在修改 PS1 和 PS2 之前,我們先用 echo 命令輸出…

contos7中mongodb數據庫無法備份與還原,數據庫工具的安裝

由于之前數據庫沒有卸載干凈&#xff0c;導致直接用sudo yum install -y mongodb-org-tools命令無法直接安裝&#xff0c;只能選擇手動安裝了。 先去官網找到mongo-tool工具 MongoDB Database Tools Downloads | MongoDB 然后復制要下載的版本的地址。 然后直接用wget來下載 …

【每日OJ —— 622. 設計循環隊列】

每日OJ —— 622. 設計循環隊列 1.題目&#xff1a;622. 設計循環隊列2.解法2.1.解法講解2.1.1.算法講解2.1.2.代碼實現2.1.3.提交通過展示 1.題目&#xff1a;622. 設計循環隊列 2.解法 1.本題有很多解法&#xff1a;可以使用數組&#xff0c;單鏈表&#xff0c;雙鏈表&#x…

2023亞太杯數學建模賽題人工精準翻譯

大家好&#xff0c;亞太杯今天早上6點已經開賽啦&#xff0c;然后我在這里給大家帶來賽題的精準人工翻譯&#xff0c;防止大家直接用軟件翻譯導致某些地方亂碼或者翻譯不精準&#xff0c;這會導致后續做題過程出現很大偏差。 注意&#xff0c;以下翻譯均免費發放word形式的哈&…

【精選】CSS入門必看知識點大合集

CSS簡介 CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;層疊樣式表&#xff0c;又叫級聯樣式表&#xff0c;簡稱樣式表 CSS文件后綴名為.css CSS用于HTML文檔中元素樣式的定義 為什么需要CSS 使用css的唯一目的就是讓網頁具有美觀一致的頁面 語法 CSS 規則…

DB2—03(DB2中常見基礎操作)

DB2—03&#xff08;DB2中常見基礎操作&#xff09; 1. 前言1.1 oracle和mysql相關 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "變" dual 3. db2中常用函數3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函數3.3 LISTAGG() …

論文《Unsupervised Dialog Structure Learning》筆記:詳解DD-VRNN

D-VRNN模型和DD-VRNN模型 總體架構 離散-可變循環變分自編碼器&#xff08;D-VRNN&#xff09;和直接-離散-可變循環變分自編碼器&#xff08;DD-VRNN&#xff09;概述。D-VRNN和DD-VRNN使用不同的先驗分布來建模 z t z_t zt?之間的轉換&#xff0c;如紅色實線所示。 x t x_t…