日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)

發(fā)布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

看完本文,可以順便解決leetcode以下兩個題目:

455.分發(fā)餅干(簡單)
135.分發(fā)糖果(困難)

一、通俗易懂的 貪心算法 |思想

貪心算法就是采用貪心的策略,保證每一次的操作都是局部最優(yōu)的,從而使得結(jié)果是全局最優(yōu)的。

比如,A、B、C、都很喜歡吃橘子,A可以吃5個、B可以吃3個、C可以吃1個;但是現(xiàn)在只有7個橘子,問最多幾個人可以吃飽;

我們選用的貪心策略就是,吃的少的人先吃,盡量先使用量少的人吃飽,所以在這里,B、C肯定是可以吃飽的;

在這里,又因為全局結(jié)果是局部結(jié)果的簡單求和,因此,局部最優(yōu)的策略同樣也是全局最優(yōu)的策略。

二、分配問題

455.分發(fā)餅干(簡單)

題目描述

假設你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個孩子最多只能給一塊餅干。對每個孩子 i,都有一個胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個尺寸 s[j] 。如果 s[j] >= g[i],我們可以將這個餅干 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數(shù)量的孩子,并輸出這個最大數(shù)值
來源:力扣(LeetCode)

輸入輸出樣例

輸入: g = [1,2,3], s = [1,1] 輸出: 1 解釋: 你有三個孩子和兩塊小餅干,3個孩子的胃口值分別是:1,2,3。雖然你有兩塊小餅干,由于他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。所以你應該輸出1。
來源:力扣(LeetCode)

題解

根據(jù)我們局部最優(yōu)的思想,當然是饑餓度小的孩子先吃了,畢竟餅干只有這么多,但是同時應該盡量使得剩下的餅干大小能夠滿足后面的孩子去吃;

因此,我們應該在餅干大小 >= 這個孩子饑餓度的餅干中,尋找到最小的那個餅干去喂他;滿足一個孩子吃飽之后,繼續(xù)使用同樣的方法去喂飽下一個孩子,知道不能滿足條件為止;

簡而言之就是,給饑餓度小的孩子分配滿足條件的餅干中大小最小的餅干。

class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {//貪心算法 先排序 然后依次比較sort(g.begin(),g.end()); //g 胃口 s 餅干大小sort(s.begin(),s.end());int i = 0,j = 0;while(i < g.size() && j < s.size()) {if(g[i] <= s[j]) {i++;}j++;}return i;} };

135.分發(fā)糖果(困難)

題目描述

老師想給孩子們分發(fā)糖果,有 N 個孩子站成了一條直線,老師會根據(jù)每個孩子的表現(xiàn),預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發(fā)糖果:每個孩子至少分配到 1 個糖果。評分更高的孩子必須比他兩側(cè)的鄰位孩子獲得更多的糖果。那么這樣下來,老師至少需要準備多少顆糖果呢?
來源:力扣(LeetCode)

我們繼續(xù)來把題目描述的通俗一些:有評分屬性的孩子,排成一排,每一個孩子至少有一個糖果,如果一個孩子比左右兩個孩子評分高,則他的糖果肯定要比左右兩位的高

輸入輸出樣例

輸入:[1,0,2]
輸出:5
解釋:你可以分別給這三個孩子分發(fā) 2、1、2 顆糖果。

題解
述455題,我們首先對于數(shù)據(jù)進行了排序,這是數(shù)據(jù)處理的常規(guī)操作,為了方便后續(xù)的大小比較;
但是此題我們使用兩次遍歷;我們的貪心策略是:每一次遍歷只考慮相鄰一側(cè)的關系;

1)每一個孩子的糖果初始化 1

2)從左到右遍歷一次;如果右邊孩子比左邊孩子評分高,那么右邊孩子得到的糖果比左邊的多一個;

3)從右到左遍歷一次;如果左邊孩子比右邊孩子評分高,而且當前左邊孩子的糖果是比右邊孩子糖果少,那么左邊孩子得到的糖果比右邊的多一個;

class Solution { public:int candy(vector<int>& ratings) {int size = ratings.size();if (size < 2) {return size;}vector<int> num(size,1); // 先都給一個糖果for (int i = 1; i < size; ++i ) { // 從左到右if (ratings[i] > ratings[i-1]) {num[i] = num[i-1] + 1;}}for (int i = size-1; i > 0; --i ) { // 從右到左if (ratings[i] < ratings[i-1]) {num[i-1] = max(num[i-1],num[i] + 1);}}return accumulate(num.begin(),num.end(),0);} };

總結(jié)

以上是生活随笔為你收集整理的通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。