老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/candy
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
又是根据数组的数据赋值的问题,和贪心算法的初始题分发饼干类似。本题思路在于两次遍历数组,先从左到右遍历,初始糖果值为1,如果大于前面的数则+1,这一过程便是贪心算法的体现,将得到的糖果数先都存储在数组中。然后从右向左遍历,规则是前面的反过来,一边遍历一边在结果中加上左遍历和右遍历的最大值。
class Solution {
public int candy(int[] ratings) {
int count = 0;
int []left = new int[ratings.length];
int right = 1; //从右边数起的最小糖果数
for(int i=0;i<ratings.length;i++){
if(i>0 && ratings[i]>ratings[i-1]){
left[i] = left[i-1]+1;
}
else{
left[i] = 1;
}
}
for(int i=ratings.length-1;i>=0;i--){
if(i!=ratings.length-1 && ratings[i]>ratings[i+1]){
right++;
}
else{
right = 1;
}
count+=Math.max(left[i],right);
}
return count;
}
}