首先,先给所有的小朋友都分配一颗糖果。
然后我们就从左往右开始遍历,只要当下一个小朋友的分数大于前一个小朋友的分数,就让下一个小朋友手上的糖果比前一个小朋友的糖果多一个。
然后,我们从右往左开始遍历,当前左边小朋友的分数大于右边一个小朋友的分数时,且此时左边小朋友的糖果数量不大于右边的,这个很重要,举个例子,当左边小朋友比右边小朋友高分时,若此时左边小朋友有3个,右边只有两个,这个时候也已经满足题目的需求了,不用再发,只有左边小朋友的糖果数小于等于2时,才需要发配糖果。
class Solution {
public int candy(int[] ratings) {
int candy[]=new int[ratings.length];
//先给所有的孩子都分配一颗
for(int i=0;i<candy.length;i++){
candy[i]=1;
}
//从左往右开始遍历,当右边的分数高过左边的时候,右边加一颗
for (int j=1;j<ratings.length;j++){
if(ratings[j]>ratings[j-1]){
candy[j]=candy[j-1]+1;
}
}
//随后从右往左开始遍历,当左边分数高过右边且左边的糖果数量不大于右边的糖果数量
for(int k=ratings.length-1;k>0;k--){
if(ratings[k]<ratings[k-1]&&candy[k-1]<=candy[k]){
candy[k-1]=candy[k]+1;
}
}
int sum=0;
for(int i=0;i<candy.length;i++){
sum+=candy[i];
}
return sum;
}
}
时间复杂度:O(n)
空间复杂度:O(n)