题目链接

135. 分发糖果 - 力扣(LeetCode)

题目描述

孩子有n个,rating[i]表示n个孩子中第i个孩子评分。

  • 每个孩子至少要分到1个糖果

  • 相邻两个孩子评分更高的孩子需要得到更多的糖果

返回满足要求的最少糖果数量

输入输出样例

1
2
3
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

题目解释

先满足第一个条件,那么糖果一定大于n个,每个孩子分配1个苹果;

再满足第二个条件,

先从左往右遍历一遍,如果右边孩子的评分比左边孩子的评分高,那么右边孩子的糖果数量变为左边孩子的糖果数量加1,保证相邻两个孩子中,右边评分高的孩子拿到更多的糖果。

再从右往左遍历,如果左边孩子的评分比右边孩子的评分高,且左边孩子的糖果数量不大于右边孩子的糖果数量,那么左边孩子的糖果数量更新为右边孩子的糖果数量加1

代码

个人实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// leetcode 101
class Solution {
public:
int candy(vector<int>& ratings) {
int size = ratings.size();
if (size < 2) {
return size;
}
vector<int> nums(size, 1);
for (int i = 0; i < size - 1; i++) {
if (ratings[i + 1] > ratings[i]) {
nums[i + 1] = nums[i] + 1;
}
}
for (int i = size - 1; i > 0; i--) {
if (ratings[i] < ratings[i - 1]) {
nums[i - 1] = max(nums[i - 1], nums[i] + 1);
}
}
return accumulate(nums.begin(), nums.end(), 0);
}
};

官方实现

作者:力扣官方题解

链接:https://leetcode.cn/problems/candy/solutions/533150/fen-fa-tang-guo-by-leetcode-solution-f01p/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
int ret = 1;
int inc = 1, dec = 0, pre = 1;
for (int i = 1; i < n; i++) {
if (ratings[i] >= ratings[i - 1]) {
dec = 0;
pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
ret += pre;
inc = pre;
} else {
dec++;
if (dec == inc) {
dec++;
}
ret += dec;
pre = 1;
}
}
return ret;
}
};