LeetCode135分发糖果

设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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值