135. 分发糖果002(贪心算法+思路+详解)
一:題目
老師想給孩子們分發(fā)糖果,有 N 個(gè)孩子站成了一條直線,老師會(huì)根據(jù)每個(gè)孩子的表現(xiàn),預(yù)先給他們?cè)u(píng)分。
你需要按照以下要求,幫助老師給這些孩子分發(fā)糖果:
每個(gè)孩子至少分配到 1 個(gè)糖果。
評(píng)分更高的孩子必須比他兩側(cè)的鄰位孩子獲得更多的糖果。
那么這樣下來,老師至少需要準(zhǔn)備多少顆糖果呢?
示例 1:
輸入:[1,0,2]
輸出:5
解釋:你可以分別給這三個(gè)孩子分發(fā) 2、1、2 顆糖果。
示例 2:
輸入:[1,2,2]
輸出:4
解釋:你可以分別給這三個(gè)孩子分發(fā) 1、2、1 顆糖果。
第三個(gè)孩子只得到 1 顆糖果,這已滿足上述兩個(gè)條件。
二:思路:
這里的思路是:局部最優(yōu),分為兩次遍歷 都是找最優(yōu)的結(jié)果
第一次遍歷:從左往右 右邊的評(píng)分比左邊的高則其糖果個(gè)數(shù)在左邊糖果個(gè)數(shù)的基礎(chǔ)上加一
第二次遍歷:從右往左 如果左邊的評(píng)分比右邊的高 且其個(gè)數(shù)不大于右邊的個(gè)數(shù) 則其糖果數(shù)在右邊糖果數(shù)的基礎(chǔ)上加一
解釋第二次遍歷:因?yàn)槲覀円蟊认噜彽脑u(píng)分低糖果數(shù)多就行,一種情況是他比兩邊都高
那么在第一次遍歷 加一 過后,到第二次就不用再加一了,故第二次遍歷
當(dāng)中的 且其個(gè)數(shù)。。。。,說的就是這個(gè)原因
三:上碼
class Solution { public:int candy(vector<int>& ratings) {//這里的思路是:局部最優(yōu),分為兩次遍歷 都是找最優(yōu)的結(jié)果//第一次遍歷:從左往右 右邊的評(píng)分比左邊的高則其糖果個(gè)數(shù)在左邊糖果個(gè)數(shù)的基礎(chǔ)上加// //一//第二次遍歷:從右往左 如果左邊的評(píng)分比右邊的高 且其個(gè)數(shù)不大于右邊的個(gè)數(shù) 則其糖 果數(shù)在右邊糖果數(shù)的基礎(chǔ)上加一//解釋第二次遍歷:因?yàn)槲覀円蟊认噜彽脑u(píng)分低糖果數(shù)多就行,一種情況是他比兩邊都高// 那么在第一次遍歷 加一 過后,到第二次就不用再加一了,故第二次遍歷// 當(dāng)中的 且其個(gè)數(shù)。。。。,說的就是這個(gè)原因map<int,int>m;map<int,int>:: iterator mt;for(int i = 0; i < ratings.size(); i++){m[i] = 1;}//從左往右邊for(int i = 0; i < ratings.size() - 1; i++){if(ratings[i] < ratings[i+1]){m[i+1] = m[i] + 1;}} //從右往左for(int i = ratings.size() - 1;i > 0; i--){if(ratings[i-1] > ratings[i] && m[i-1] <= m[i]){m[i-1] = m[i] + 1;}} int sum = 0;for(mt = m.begin(); mt != m.end(); mt++){sum+=mt->second;} return sum; } };
加油 BOY!!!! 如有問題請(qǐng)留言!!
總結(jié)
以上是生活随笔為你收集整理的135. 分发糖果002(贪心算法+思路+详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机构:2023年三星智能手机预计将在42
- 下一篇: Jdbc创建表 利用循环添加数据 ,更新