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
解:
-
遍历一次找到最小的数。确定当前位置为最少的一个糖果
-
从最小位置向右遍历
-
如果下一个位置大于前一位值 那么下一个位置糖果数+1
-
如果下一个位置小于前一位值 那么下一个位置糖果数=1 . 当小于前一位置时,循环往回遍历.判断前一位是不是大于下一位 并且糖果数是不是大于小一位 如果是 就将前一个位置糖果数+1, 继续往后走一位判断. 直到前一位不再大于后一位置的值.
-
从最小位置向左遍历 与上面逻辑一样
class Solution {
public int candy(int[] ratings) {
int[] result = new int[ratings.length];
int minIndex = 0;
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] < ratings[minIndex]) {
minIndex = i;
}
}
//找到最小位置
result[minIndex] = 1;//从最小位置向左遍历 if (minIndex != 0) { for (int i = minIndex - 1; i >= 0; i--) { //如果下一个位置大于前一位值 那么下一个位置糖果数+1 if (ratings[i] > ratings[i + 1]) { result[i] = result[i + 1] + 1; } else { //如果下一个位置小于前一位值 那么下一个位置糖果数=1 result[i] = 1; int index = i; // 当小于前一位置时,循环往回遍历.判断前一位是不是大于下一位 并且糖果数是不是大于小一位 如果是 就将前一个位置糖果数+1, 继续往后走一位判断. 直到前一位不再大于后一位置的值. while (ratings[index + 1] > ratings[index] && result[index + 1] <= result[index]) { result[index + 1] = result[index] + 1; index++; } } } } //从最小位置向右遍历 if (minIndex != (ratings.length - 1)) { for (int i = minIndex + 1; i < ratings.length; i++) { if (ratings[i] > ratings[i - 1]) { result[i] = result[i - 1] + 1; } else { result[i] = 1; int index = i; while (ratings[index - 1] > ratings[index] && result[index - 1] <= result[index]) { result[index - 1] = result[index] + 1; index--; } } } } int r = 0; for (int i = 0; i < result.length; i++) { r = r + result[i]; } return r; }
}