描述
有 N 个小孩站成一列。每个小孩有一个评级。
按照以下要求,给小孩分糖果:
每个小孩至少得到一颗糖果。
评级越高的小孩可以比他相邻的两个小孩得到更多的糖果。
需最少准备多少糖果?
您在真实的面试中是否遇到过这个题?
样例
给定评级 = [1, 2], 返回 3.
给定评级 = [1, 1, 1], 返回 3.
有 N 个小孩站成一列。每个小孩有一个评级。
按照以下要求,给小孩分糖果:
每个小孩至少得到一颗糖果。
评级越高的小孩可以比他相邻的两个小孩得到更多的糖果。
需最少准备多少糖果?
您在真实的面试中是否遇到过这个题?
样例
给定评级 = [1, 2], 返回 3.
给定评级 = [1, 1, 1], 返回 3.
给定评级 = [1, 2, 2], 返回 4. ([1,2,1]).
程序
class Solution {
public:
/**
* @param ratings: Children's ratings
* @return: the minimum candies you must give
*/
int candy(vector<int> &ratings) {
// write your code here
if(ratings.empty())
return 0;
if(ratings.size() == 1)
return 1;
vector<int> results(ratings.size(), 0);
for(int i = 1; i < ratings.size(); i++){
if(ratings[i] > ratings[i - 1] && results[i - 1] == 0)
results[i] = 1;
//在原来已经是1的位置上再加1
else if(ratings[i] > ratings[i - 1] && results[i - 1] != 0)
results[i] = results[i - 1] + 1;
}
//上面是从左向右遍历过来,为了保存原来的数值,需要加max
//比如[4,2,3,4,1],经过上面的计算后[0,0,1,2,0]
for(int i = ratings.size() - 2; i >= 0; i--){
if(ratings[i] > ratings[i + 1] && results[i + 1] == 0)
results[i] = max(1, results[i]);
else if(ratings[i] > ratings[i + 1] && results[i + 1] != 0)
results[i] = max(results[i], results[i + 1] + 1);
}
int counts = ratings.size();
for(int i = 0; i < results.size(); i++)
counts += results[i];
return counts;
}
};