題目描述
一羣孩子站成一排,每一個孩子有自己的評分。現在需要給這些孩子發糖果,規則是如果一 個孩子的評分比自己身旁的一個孩子要高,那麼這個孩子就必須得到比身旁孩子更多的糖果;所有孩子至少要有一個糖果。求解最少需要多少個糖果。
解題思路
-
把所有孩子的糖果數初始化爲 1; 先從左往右遍歷一遍,如果右邊孩子的評分比左邊的高,則右邊孩子的糖果數更新爲左邊孩子的 糖果數加1;
-
再從右往左遍歷一遍,如果左邊孩子的評分比右邊的高,且左邊孩子當前的糖果數 不大於右邊孩子的糖果數,則左邊孩子的糖果數更新爲右邊孩子的糖果數加1。
-
通過這兩次遍歷, 分配的糖果就可以滿足題目要求了。這裏的貪心策略即爲,在每次遍歷中,只考慮並更新相鄰一 側的大小關係。
AC
class Solution {
public:
int candy(vector<int>& ratings) {
int size = ratings.size();
if(size<2) return size;
vector<int> v(size,1);
//先從左到右遍歷
for(int i=0;i<size-1;i++){
if(ratings[i+1]>ratings[i])
v[i+1]=v[i]+1;
}
//再從右到左遍歷
for(int i=size-1;i>=1;i--){
if(ratings[i-1]>ratings[i])
v[i-1]=max(v[i-1],v[i]+1);
}
return accumulate(v.begin(),v.end(),0);
}
};
學如逆水行舟,不進則退