1 题目描述
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到 1 个糖果。
- 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
2 算法设计
这道题目最好从一边开始考虑,如果两边同时考虑的话容易出错。
(1)先按照从左到右的顺序遍历数组ratings,确定右边评分大于左边的情况。
局部最优: 只要右边评分比左边评分高,右边就比左边多一个糖果。
全局最优: 相邻的孩子中,评分高的右孩子比左孩子获得更多的糖果。
(2)再按照从右到左的顺序遍历数组ratings,确定左边评分大于右边评分的情况。
局部最优: 只要左边评分比右边评分高,左边的孩子就比右边的孩子多一个糖果。
全局最优: 相邻的孩子中,评分高的左孩子比右孩子获得更多的糖果。
3 代码实现
public static int candy(int[] ratings) {
int[] candy = new int[ratings.length];
Arrays.fill(candy,1); //所有的孩子至少有一个糖果
//从左向右遍历,使得相邻孩子中,评分高的右孩子获得比左孩子更多的糖果
for(int i=1;i< ratings.length;i++){
candy[i] = ratings[i] > ratings[i-1] ? candy[i-1]+1:candy[i];
}
//从右向左遍历,确定左边大于右边的情况
for (int j=ratings.length-2;j>=0;j--){
if (ratings[j] > ratings[j+1]){
if (candy[j] <= candy[j+1]){
candy[j] = candy[j+1]+1;
}
}
}
return Arrays.stream(candy).sum();
}