1.暴力解法
class Solution {
public int candy(int[] ratings) {
int sum=0;
int[] candies = new int[ratings.length];
Arrays.fill(candies,1);
boolean flag=true;
while(flag){
flag=false;
for(int i=0;i<ratings.length;i++){
if(i<ratings.length-1&&ratings[i]>ratings[i+1]&&candies[i]<=candies[i+1]){
candies[i]=candies[i+1]+1;
flag=true;
}
if(i>0&&ratings[i]>ratings[i-1]&&candies[i]<=candies[i-1]){
candies[i]=candies[i-1]+1;
flag=true;
}
}
}
for(int i=0;i<ratings.length;i++){
sum+=candies[i];
}
return sum;
}
}
设置candies数组来统计每个孩子拿到的糖果数,每个孩子起始数量为1
之后遍历,看看这个candies[i]的左右,它比左边大就加1 ,比右边大就加1
设置flag变量,一旦有改变,就遍历,直到candies数组所有的数不在变化
2. 双数组
class Solution {
public int candy(int[] ratings) {
int sum=0;
int[] left = new int[ratings.length];
int[] right = new int[ratings.length];
Arrays.fill(left,1);
Arrays.fill(right,1);
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]&&left[i]<=left[i-1]){
left[i]=left[i-1]+1;
}
}
for(int i=ratings.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1]&&right[i]<=right[i+1]){
right[i]=right[i+1]+1;
}
}
for(int i=0;i<ratings.length;i++){
sum+=Math.max(left[i],right[i]);
}
return sum;
}
}
用双数组分别存储从左和从右,孩子应该得到的糖果数,然后取两个数组中同index的最大值