设ratings=[1,2,3,4,5,3,2]
初始可对所有人先发一个糖果res=[1,1,1,1,1,1,1]
如果想两边同时比较在判断糖果数量显然是有点困难的,因此可以先从左往右遍历判断分发糖果数量,再从右往左遍历判断
从左往右遍历:若i+1处的评分高于i处的,res[i+1]=res[i]+1;即res=[1,2,3,4,5,1,1]
从右左遍历: 若i-1处的评分高于i,res[i-1]=res[i]+1;即res=[1,2,3,4,3,2,1]
注意到此时res[4]处的结果明显错误,是因为只考虑了+1,而没有判断它本身的糖果数是否已经超过了后一数值加1
所以在从右往左遍历时,应注意res[i-1]=Math.max(res[i-1],res[i]+1);
class Solution {
public int candy(int[] ratings) {
int[] res=new int[ratings.length];
int sum=ratings.length;
for(int i=0;i<ratings.length-1;i++){ //正向遍历
if(ratings[i+1]>ratings[i]){ //比较右边大于左边
res[i+1]=res[i]+1;
}
}
for(int i=ratings.length-1;i>=1;i--){ //反向遍历
if(ratings[i-1]>ratings[i]){ //比较左边大于右边
res[i-1]=Math.max(res[i]+1,res[i-1]);
}
}
for(int i=0;i<res.length;i++){
sum+=res[i];
}
return sum;
}
}