题目描述:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
解题思路:利用贪心思想,两次遍历,第一次从前往后,只处理rating value递增的区间,每一个递增区间开始处的糖果数目为1,
第二次从后往前,只处理rating value递减的区间,每一个递减区间的结束处的糖果数目为1。
经过这样的两次遍历操作后,每个child都得到满足题目要求的糖果,
然后再遍历一遍把每个child的糖果数目加起来即为最后的结果。
AC代码如下:
class Solution{
public:
int candy(vector<int>& ratings)
{
if (ratings.size() == 0) return 0;
vector<int> candy(ratings.size(), 1);
int num = 1;
for (int i = 1; i < ratings.size(); ++i){
if (ratings[i]>ratings[i - 1]) candy[i] = ++num;
else num = 1;
}
num = 1;
for (int i = ratings.size() - 2; i >= 0; --i){
if (ratings[i] > ratings[i + 1]){
candy[i] = max(++num, candy[i]);
}
else{
num = 1;
}
}
int ans = 0;
for (int i = 0; i < ratings.size(); ++i) ans += candy[i];
return ans;
}
};