通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
看完本文,可以順便解決leetcode以下兩個題目:
455.分發餅干(簡單)
135.分發糖果(困難)
一、通俗易懂的 貪心算法 |思想
貪心算法就是采用貪心的策略,保證每一次的操作都是局部最優的,從而使得結果是全局最優的。
比如,A、B、C、都很喜歡吃橘子,A可以吃5個、B可以吃3個、C可以吃1個;但是現在只有7個橘子,問最多幾個人可以吃飽;
我們選用的貪心策略就是,吃的少的人先吃,盡量先使用量少的人吃飽,所以在這里,B、C肯定是可以吃飽的;
在這里,又因為全局結果是局部結果的簡單求和,因此,局部最優的策略同樣也是全局最優的策略。
二、分配問題
455.分發餅干(簡單)
題目描述
假設你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個孩子最多只能給一塊餅干。對每個孩子 i,都有一個胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個尺寸 s[j] 。如果 s[j] >= g[i],我們可以將這個餅干 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數量的孩子,并輸出這個最大數值
來源:力扣(LeetCode)
輸入輸出樣例
輸入: g = [1,2,3], s = [1,1] 輸出: 1 解釋: 你有三個孩子和兩塊小餅干,3個孩子的胃口值分別是:1,2,3。雖然你有兩塊小餅干,由于他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。所以你應該輸出1。
來源:力扣(LeetCode)
題解
根據我們局部最優的思想,當然是饑餓度小的孩子先吃了,畢竟餅干只有這么多,但是同時應該盡量使得剩下的餅干大小能夠滿足后面的孩子去吃;
因此,我們應該在餅干大小 >= 這個孩子饑餓度的餅干中,尋找到最小的那個餅干去喂他;滿足一個孩子吃飽之后,繼續使用同樣的方法去喂飽下一個孩子,知道不能滿足條件為止;
簡而言之就是,給饑餓度小的孩子分配滿足條件的餅干中大小最小的餅干。
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.分發糖果(困難)
題目描述
老師想給孩子們分發糖果,有 N 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果:每個孩子至少分配到 1 個糖果。評分更高的孩子必須比他兩側的鄰位孩子獲得更多的糖果。那么這樣下來,老師至少需要準備多少顆糖果呢?
來源:力扣(LeetCode)
我們繼續來把題目描述的通俗一些:有評分屬性的孩子,排成一排,每一個孩子至少有一個糖果,如果一個孩子比左右兩個孩子評分高,則他的糖果肯定要比左右兩位的高
輸入輸出樣例
輸入:[1,0,2]
輸出:5
解釋:你可以分別給這三個孩子分發 2、1、2 顆糖果。
題解
述455題,我們首先對于數據進行了排序,這是數據處理的常規操作,為了方便后續的大小比較;
但是此題我們使用兩次遍歷;我們的貪心策略是:每一次遍歷只考慮相鄰一側的關系;
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);} };總結
以上是生活随笔為你收集整理的通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 位运算的那些奇技淫巧 | 掌(装)握(
- 下一篇: 通俗易懂:贪心算法(二):区间问题 (力