題目:給一排小孩發糖果,每個小孩有自己的評分,評分高的小孩得到的糖果比評分低的左右鄰居要多。每個小孩至少一個糖果。問最少發多少糖果?
分析:
對於一個順序上升或者下降的評分序列,小孩得到的糖果最少也得是遞增/遞減的
比如
評分 1 3 5 7 8
糖果 1 2 3 4 5
評分 9 7 4 3 1
糖果 5 4 3 2 1
而對於非遞增/遞減的評分序列,可以拆分成幾段上升/下降的序列
另外可以考慮,從左到右掃描評分數組,使之滿足最少的遞增情況的糖果分發
然後從右到左掃描,使之滿足最少的遞減情況的糖果分發。
答案:
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candies;
candies.push_back(1);
for (int i = 1; i< ratings.size(); i++){
if (ratings[i-1] < ratings[i])
candies.push_back(candies[i-1] +1);// i should has more than i-1
else
candies.push_back(1);
}
for (int i = ratings.size() - 2; i>=0; i--){
if (ratings[i] > ratings[i+1] && candies[i] <= candies[i+1])
candies[i] = (candies[i+1] +1);// i should has more than i+1
}
int sum = 0;
for (int i = 0; i< candies.size(); i++){
sum +=candies[i];
}
return sum;
}
};