时间轴

2025-10-20

init


题目:

可以想象 ratings 构成一段连绵的山,最开始我们初始化为 1,是平坦的平地,从左向右扫描会处理上坡的所有元素,从右向左扫描处理下坡的元素,而对于上下坡的分界点,要由左边要求的和右边要求的最大值+1,才能既满足上坡,又满足下坡。

初始化先给每一个人发一个糖果。

🍬 Step 1:从左到右
保证右边比左边高的孩子糖果更多:

1
2
if ratings[i] > ratings[i-1]
candy[i] = candy[i-1] + 1

🍬 Step 2:从右到左

保证左边比右边高的孩子糖果更多,同时和已有值取最大(避免破坏左到右的规则):

1
2
if ratings[i] > ratings[i+1]
candy[i] = max(candy[i], candy[i+1] + 1)
  • 上坡从左往右,因为右边需要参考左边
  • 下坡从右往左,因为左边需要参考右边

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <numeric>
#include <vector>
#include <algorithm>
using std::vector;

class Solution {
public:
int candy(vector<int> &ratings)
{
int i, n = ratings.size();

vector<int> candies(n, 1);
// left to right
for (i = 1; i < n; i++) {
if (ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
}
}
// right to left
for (i = n - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candies[i] = std::max(candies[i + 1] + 1,
candies[i]);
}
}

return std::accumulate(candies.begin(), candies.end(), 0);
}
};