n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
提示:
n == ratings.length
1 <= n <= 2 * 104
0 <= ratings[i] <= 2 * 104
思路来源:代码随想录
总的来说是先从左边遍历到右边,期间判断右边比左边大,然后相应赋值,再从右边遍历到左边,再赋值。
class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
int[] res = new int[len];
res[0] = 1;
int result = 0;
for (int i = 1; i < len; i++) {
if(ratings[i] > ratings[i-1]){
res[i] = res[i-1]+1;
}else {
res[i] = 1;
}
}
for (int i = len-2; i >=0 ; i--) {
if(ratings[i] > ratings[i+1]) {
res[i] = Math.max(res[i], res[i + 1] + 1);
}
}
for (int i = 0; i < res.length; i++) {
result += res[i];
}
return result;
}
}
class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
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;
}
}