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?
解题思路:使用贪心算法
解法一:使用长度为ratings.length的数组存放每个小孩candy数,从前往后遍历ratings数组,若ratings[i]>ratings[i-1],则candy[i]=candy[i-1]+1,否则candy[i]=1。然后再从后往前遍历ratings,同时改变candy值。
public class Solution {
public int candy(int[] ratings) {
int count=ratings.length;
int result=0;
int [] candy=new int[count];
candy[0]=1;
for(int i=1;i<count;i++){
if(ratings[i]>ratings[i-1]){
candy[i]=candy[i-1]+1;
}else{
candy[i]=1;
}
}
for(int i=count-2;i>=0;i--){
if(ratings[i]>ratings[i+1]){
candy[i]=Math.max(candy[i+1]+1, candy[i]);
}
}
for(int i=0;i<count;i++){
result+=candy[i];
}
return result;
}
}
解法二:使用变量sum记录candy总数,preCount记录前个小孩的candy数,maxCount记录递增序列的峰值,deLen记录递减序列长度。一次遍历ratings数组,若为递增,则每回当前candy数为前个小孩拿到的+1,即preCount+1,若当前ratings值与前一个相同则当前candy数为1,同时更新candy总数。若当前ratings值比前一个小则记录递增序列的峰值maxCount,同时递减序列长度deLen+1,更新candy总数sum=deLen.若峰值小于等于deLen,则maxCount++,同时sum++。最后输出sum。
public class Solution {
public int candy(int[] ratings) {
int sum=1;
int preCount=1;
int curCount=1;
int maxCount=1;
int desLen=0;
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]){
curCount=preCount+1;
sum=sum+curCount;
maxCount=curCount;
preCount=curCount;
}else if(ratings[i]==ratings[i-1]){
sum=sum+1;
maxCount=1;
preCount=1;
}else{
while(i<ratings.length&&ratings[i]<ratings[i-1]){
desLen++;
if(maxCount<=desLen){
maxCount++;
sum++;
}
sum=sum+desLen;
i++;
}
i=i-1;
desLen=0;
preCount=1;
maxCount=1;
}
}
return sum;
}
}