老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
思路:这题我写的比较丑陋,我的方法是从前到后扫一遍给所有的递增序列赋值,在从后到前扫一遍给递减序列赋值,我们知道,递增和递减序列是可以确定糖果数量的,这样两趟扫完后只剩下极值点没有分糖果了,然后我们根据情况赋给他们糖果即可。头和尾我单独处理了。。。。
class Solution {
public int candy(int[] ratings) {
int len=0,ans=0;
int[] nums=new int[ratings.length];
if(ratings.length<=1) return ratings.length;
for(int i=1;i<ratings.length;i++)
{
if(ratings[i]>ratings[i-1])
nums[i-1]=++len;
else
len=0;
}
len=0;
for(int i=ratings.length-2;i>=0;i--)
{
if(ratings[i]>ratings[i+1])
nums[i+1]=++len;
else
len=0;
}
if(nums[0]==0)
{
if(ratings[0]<=ratings[1])
nums[0]=1;
else
nums[0]=nums[1]+1;
}
if(nums[ratings.length-1]==0)
{
if(ratings[ratings.length-1]<=ratings[ratings.length-2])
nums[ratings.length-1]=1;
else
nums[ratings.length-1]=nums[ratings.length-2]+1;
}
for(int i=1;i<ratings.length-1;i++)
{
if(nums[i]>0) continue;
if(ratings[i]<=ratings[i-1] && ratings[i]<=ratings[i+1])
nums[i]=1;
else if(ratings[i]>ratings[i-1] && ratings[i]>ratings[i+1])
nums[i]=Math.max(nums[i-1], nums[i+1])+1;
else if(ratings[i]>=ratings[i-1] &&ratings[i]>=ratings[i+1])
{
if(ratings[i]==ratings[i+1])
nums[i]=nums[i-1]+1;
else if(ratings[i]==ratings[i-1])
nums[i]=nums[i+1]+1;
}
}
for(int i=0;i<ratings.length;i++)
ans+=nums[i];
return ans;
}
}