135. 分发糖果 - 题目链接
n
个孩子站成一排。给你一个整数数组ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入: r a t i n g s = [ 1 , 0 , 2 ] ratings = [1,0,2] ratings=[1,0,2]
输出: 5 5 5
解释:你可以分别给第一个、第二个、第三个孩子分发 2 、 1 、 2 2、1、2 2、1、2 颗糖果。
示例 2:
输入: r a t i n g s = [ 1 , 2 , 2 ] ratings = [1,2,2] ratings=[1,2,2]
输出: 4 4 4
解释:你可以分别给第一个、第二个、第三个孩子分发 1 、 2 、 1 1、2、1 1、2、1 颗糖果。
第三个孩子只得到 1 1 1 颗糖果,这满足题面中的两个条件。
提示:
- n = = r a t i n g s . l e n g t h n == ratings.length n==ratings.length
- 1 < = n < = 2 ∗ 1 0 4 1 <= n <= 2 * 10^4 1<=n<=2∗104
- 0 < = r a t i n g s [ i ] < = 2 ∗ 1 0 4 0 <= ratings[i] <= 2 * 10^4 0<=ratings[i]<=2∗104
说实话这题能评红我是没想到的,感觉最多黄。
题意很简单,大概就是给一排孩子的评分,让你按评分发糖,每人最少拿
1
1
1 颗,评分高的要比评分低的多,一样或者更少可以只发一颗。甚至没有让孩子们站成一个圈,而是一条首尾不相连的队伍。
我的思路是开一个数组
C
a
n
d
y
Candy
Candy存放每个孩子分到的糖,方便后续处理,初始化给数组每个元素赋值为
1
1
1。然后先从左往右遍历,每次只比较当前孩子和其左边孩子的评分,更高则糖果比左边
+
1
+1
+1,否则置为
1
1
1。当然这样肯定是不完整的,所以还需从右往左再遍历一次,这次处理需要同时比较每一个孩子两边的孩子的评分,并作相应处理,最后再特判
0
0
0号位的孩子。
虽说实际上自己也是靠着数据调了几次才做出来的,不过整体上来说实现思路并不难。
完整代码如下,附注释:
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();//孩子数
if (n < 2)return 1;//n==1时特判
if (n == 2)return ratings[0] == ratings[1] ? 2 : 3;//n==2时特判
vector<int>Candy(n, 1);//初始化糖果,每个人至少分到1个
for (int i = 1; i < n; ++i) {//从左往右遍历
if (ratings[i] > ratings[i - 1])Candy[i] = max(Candy[i], Candy[i - 1] + 1);
//若当前位置的孩子评分比左边的高,则比左边多分到一个糖果
else Candy[i] = 1;//若评分更低,则只给一颗糖
}
for (int i = n - 1; i > 1; --i) {//从右往左遍历,依次处理当前位置的左边一个孩子
if (ratings[i] < ratings[i - 1]) {//若当前位置的孩子评分比左边的更低
if (ratings[i - 1] <= ratings[i - 2])Candy[i - 1] = max(Candy[i - 1], Candy[i] + 1);
//且左边的孩子评分比左边的左边孩子更低,则该孩子分到的糖为max(自己已分得的,当前位置孩子分得的+1)
else Candy[i - 1] = max(Candy[i - 1], max(Candy[i - 2] + 1, Candy[i] + 1));
//否则左边的孩子比两边孩子评分都高,则取两边孩子分得糖果数多的再加一
}
}
if (ratings[0] > ratings[1])Candy[0] = max(Candy[0], Candy[1] + 1);//特殊处理第0号孩子
int tot = 0;
for (int i = 0; i < n; ++i)
tot += Candy[i];//统计所有糖果数
return tot;
}
};
完整代码也可看我的Github:传送门
最终结果是用空间换时间了,不过也还算可以。
看了一下官方题解,我的思路似乎和官方的解差不多,还是不错的。
总之就是个不算太难的数组模拟题吧,主要还是看实现思路,因为是红题所以搞了篇博客写。
以上。