n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
这道题目最好从一边开始考虑,如果两边同时考虑的话容易出错。
(1)先按照从左到右的顺序遍历数组ratings,确定右边评分大于左边的情况。
局部最优: 只要右边评分比左边评分高,右边就比左边多一个糖果。
全局最优: 相邻的孩子中,评分高的右孩子比左孩子获得更多的糖果。
(2)再按照从右到左的顺序遍历数组ratings,确定左边评分大于右边评分的情况。
局部最优: 只要左边评分比右边评分高,左边的孩子就比右边的孩子多一个糖果。
全局最优: 相邻的孩子中,评分高的左孩子比右孩子获得更多的糖果。
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();}