Problem:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
注意:只有rating更高的邻居分配更多的candy,如果邻居的rating值相同,分配的candy数可以不一样。
思路:1.从前向后遍历ratings数组,找到从递减到递增的拐点,当邻居的rating值相同时,最后一个为拐点。
2.拐点分配的candy数为1,从拐点开始分配的candy数依次递增1,直到rating出现不增趋势(相同或下降)为止。
3.从后向前遍历分配数组candies,从拐点开始,给尚未分配candy的节点依次递增1分配candy,如果在递增到递减拐点出现冲突,修改原来分配的candy值。
Solution:
public class Solution {
public int candy(int[] ratings) {
int[] candies = new int[ratings.length];
if(candies.length==0)
return 0;
if(candies.length==1)
return 1;
if(candies.length==2)
{
if(ratings[0]!=ratings[1])
return 3;
else
return 2;
}
candies[0] = 1;
for(int i=1;i<ratings.length-1;i++)
{
if(ratings[i-1]>=ratings[i]&&ratings[i]<=ratings[i+1])
candies[i] = 1;
if(ratings[i-1]<ratings[i])
candies[i] = candies[i-1] + 1;
}
if(ratings[ratings.length-1]<=ratings[ratings.length-2])
candies[ratings.length-1] = 1;
else
candies[ratings.length-1] = candies[ratings.length-2] + 1;
int sum = candies[ratings.length-1];
for(int i=ratings.length-2;i>=1;i--)
{
if(candies[i]==0)
{
candies[i] = candies[i+1]+1;
if(candies[i-1]!=0&&candies[i-1]<=candies[i]&&ratings[i-1]>ratings[i])
candies[i-1] = candies[i]+1;
}
sum += candies[i];
}
if(ratings[0]>ratings[1])
candies[0] = candies[1]+1;
sum += candies[0];
return sum;
}
}
public int candy(int[] ratings) {
int[] candies = new int[ratings.length];
if(candies.length==0)
return 0;
if(candies.length==1)
return 1;
if(candies.length==2)
{
if(ratings[0]!=ratings[1])
return 3;
else
return 2;
}
candies[0] = 1;
for(int i=1;i<ratings.length-1;i++)
{
if(ratings[i-1]>=ratings[i]&&ratings[i]<=ratings[i+1])
candies[i] = 1;
if(ratings[i-1]<ratings[i])
candies[i] = candies[i-1] + 1;
}
if(ratings[ratings.length-1]<=ratings[ratings.length-2])
candies[ratings.length-1] = 1;
else
candies[ratings.length-1] = candies[ratings.length-2] + 1;
int sum = candies[ratings.length-1];
for(int i=ratings.length-2;i>=1;i--)
{
if(candies[i]==0)
{
candies[i] = candies[i+1]+1;
if(candies[i-1]!=0&&candies[i-1]<=candies[i]&&ratings[i-1]>ratings[i])
candies[i-1] = candies[i]+1;
}
sum += candies[i];
}
if(ratings[0]>ratings[1])
candies[0] = candies[1]+1;
sum += candies[0];
return sum;
}
}