题目描述
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?
public class Solution {
public int candy(int[] ratings) {
int[] candies=new int[ratings.length];
for(int i=0;i<ratings.length;i++){
candies[i]=1;
}
candies=order(ratings,candies);
candies=reverse(ratings,candies);
return sum(candies);
}
public int[] order(int[] ratings,int[] candies){
int count=0;
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]) { count++; candies[i]+=count; }
else if(ratings[i]<=ratings[i-1]){ count=0;}
}
return candies;
}
public int[] reverse(int[] ratings,int[] candies){
int count=0;
for(int i=ratings.length-1;i>0;i--){
if(ratings[i-1]>ratings[i]) { count++; if(candies[i-1]>count) continue; candies[i-1]=count+1; }
else if(ratings[i-1]<=ratings[i]){ count=0;}
}
return candies;
}
public int sum(int[] candies){
int count=0;
for(int i=0;i<candies.length;i++){
count+=candies[i];
}
return count;
}
}
/*
从前往后遍历的过程中,如果后面一个元素比前面的大,则在前面的基础上加1,如果后面的元素比前面的小,则让其等于1.
从后往前遍历和从前往后遍历的过程一样。
*/
注意的问题:
1、当出现两个数相等的时候,可以让后面一个数变为1,根据前面给的条件。
2、当两头遍历到中间某个最大值时,选择遍历结果的最大值。