
核心思想
- 初始化每个学生的糖果数为1:
- 从左到右遍历:
- 如果当前学生的评分高于前一个学生,则当前学生的糖果数应比前一个学生多一颗。
- 从右到左遍历:
- 如果当前学生的评分高于后一个学生,则当前学生的糖果数应比后一个学生多一颗。
- 同时确保当前学生的糖果数不小于先前分配的糖果数(在从左到右遍历时确定的)。
- 计算糖果总数:
代码解决
class Solution {
public:
int candy(vector<int>& ratings)
{
int result = 0;
vector<int> candyNum(ratings.size(), 1); // 初始化每个学生的糖果数为1
// 从左到右遍历,确保评分高的学生比前一个学生得到更多的糖果
for (int i = 1; i < ratings.size(); i++)
{
if (ratings[i] > ratings[i - 1])
{
candyNum[i] = candyNum[i - 1] + 1;
}
}
// 从右到左遍历,确保评分高的学生比后一个学生得到更多的糖果
for (int i = ratings.size() - 2; i >= 0; i--)
{
if (ratings[i] > ratings[i + 1])
{
candyNum[i] = max(candyNum[i + 1] + 1, candyNum[i]);
}
}
// 计算糖果总数
for (int num : candyNum)
{
result += num;
}
return result;
}
};