目录
题目
要求:
n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1个糖果。- 相邻两个孩子中,评分更高的那个会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例:

思路:
分糖的原则是:
- 每个孩子至少分配到
1个糖果。 - 相邻两个孩子中,评分更高的那个会获得更多的糖果。
可以看出来,一个小朋友分到的糖果数量是由自己的分数和左右的分数决定的。
例如:
小朋友的分数:2,1,3,4,5,2,2,1,3,0
得到的糖果数:2,1,2,3,4,1,2,1,2,1
特殊地:
情况一:
小朋友的分数:2,3,4,5,6
得到的糖果数:1,2,3,4,5
情况二:
小朋友的分数:4,5,6,3,2
得到的糖果数:1,2,3,2,1
可见,比左右的小朋友分数高,就能比ta的糖果多一,如果比左右的评分都高,则取更大的那个。如果比左右分数都低,则得到的糖果数为1。但是这样还是很难判断。
所以,每次单从一个方向看。
- 从左向右看:设第一个小朋友得到的糖果为1,如果之后的小朋友只要评分高于前一个,则获得的糖果数比前面的小朋友多一个,如果低于前一个,则只得到1个糖果,如下:
小朋友的分数:2,1,3,4,5,2,2,1,3,0
从左向右看: 1,1,2,3,4,1,1,1,2,1
- 从右向左看:设最后一个小朋友得到的糖果为1,如果之前的小朋友只有评分高于后一个,则获得的糖果数就比后边的小朋友多一个,反之则得到1个糖果,如下:
小朋友的分数:2,1,3,4,5,2,2,1,3,0
从右向左看: 2,1,1,1,2,1,2,1,2,1
每次取高的:
小朋友的分数:2,1,3,4,5,2,2,1,3,0
从左向右看: 1,1,2,3,4,1,1,1,2,1
从右向左看: 2,1,1,1,2,1,2,1,2,1
得到的糖果数:2,1,2,3,4,1,2,1,2,1
则我们需要两个数组用于记录,我这里用 recordLeft 记录从左向右 看得到的糖果数;用recordRight 记录从右向左看得到的糖果数。
结果每次取大就行。
代码
cpp
class Solution
{
public:
int candy(vector<int>& ratings)
{
int n = ratings.size();
if(n == 1) return 1;
vector<int> recordLeft(n, 1);
vector<int> recordRight(n, 1);
for(int i = 1; i < n ; i++)
{
if(ratings[i] > ratings[i - 1])
recordLeft[i] = recordLeft[i - 1] + 1;
else
recordLeft[i] = 1;
}
for(int i = n - 2; i >= 0; i--)
{
if(ratings[i] > ratings[i + 1])
recordRight[i] = recordRight[i + 1] + 1;
else
recordRight[i] = 1;
}
//总和
int res = 0;
for(int i = 0; i < n; i++)
res += max(recordLeft[i], recordRight[i]);
return res;
}
};