135. Candy
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?
分析
这个题目和这个题目:trapping rain water挺相似的,可以通过向左向右分别遍历,计算出每个小孩需要增加的糖果数,最后累计即可
源码
class Solution {
public:
// 向左向右各扫描一遍数组
int candy(vector<int>& ratings) {
vector<int> increase(ratings.size());
int inc = 1;//至少要增加1
// 向右扫描
for(int i = 1; i < ratings.size(); i++) {
if(ratings[i-1] < ratings[i]) { // 比左边高需要多分一颗糖
increase[i] = max(inc,increase[i]);
inc++;
}else{ // 比左边矮或相等不分糖
inc = 1;
}
}
// 向左扫描
inc = 1;
for(int i = ratings.size() - 2; i >= 0; i--) {
if(ratings[i] > ratings[i+1]) { // 比右边高需要多分一颗糖
increase[i] = max(inc,increase[i]);
inc++;
}else{ // 比左边矮或相等不分糖
inc = 1;
}
}
int ret = ratings.size();//每个人至少一颗糖
for(auto k : increase) ret += k;
return ret;
}
};