题目:
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?
题目解析:
有N个孩子站在一条线上。每个孩子都被赋予一个评分值。
你正在给这些孩子们送糖果,这些孩子受到以下要求:
每个孩子至少要有一个糖果。
得分较高的孩子比他们的邻居得到更多的糖果。
你必须给的最小糖果是多少?
每个孩子的评分高的话,就要大于旁边的孩子的 糖果数 ;
那么我们可以现将所有孩子的糖果数 都算成是1;
从左到右开始遍历一遍这个评分表,要是当前孩子的评分高于左边的孩子,那么他的糖果数就等于左边孩子的糖果数 +1;
再从右到左遍历 评分表,要是当前的孩子的评分高于右边的孩子,并且分配到的糖果数还小于等于右边的孩子 ,那么他的糖果数就等于 右边孩子的糖果数+1;
这样就合理解决了上述的问题:
代码实现:
class Solution {
public:
int candy(vector<int> &ratings) {
int n = ratings.size();
//要是当前的孩子数为 0
if(n == 0)
return 0;
//孩子数为 1
if(n== 1)
return 1;
//size保存的是 每个孩子糖果的个数
vector<int> size;
size.resize(n,1);
//从左到右遍历
for(int i = 1;i < n ;++i)
{
//要是当前的孩子的评分高于 左边的孩子
if(ratings[i] > ratings[i-1])
{
//糖果的个数 +1;
size[i] = size[i-1]+1;
}
}
//从右向左遍历
for(int i = n-1;i > 0 ;--i)
{
//要是当前的孩子的评分 盖于右边的孩子,且 糖果数还<= 右边的孩子
if(ratings[i-1] > ratings[i]&&size[i-1] <=size[i])
{
size[i-1] = size[i]+1;
}
}
int ret= 0 ;
for(int i = 0 ;i < n;++i)
{ret+= size[i];}
return ret;
}
};