赞
踩
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(); }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。