135 分发糖果

首先,先给所有的小朋友都分配一颗糖果。

然后我们就从左往右开始遍历,只要当下一个小朋友的分数大于前一个小朋友的分数,就让下一个小朋友手上的糖果比前一个小朋友的糖果多一个。

然后,我们从右往左开始遍历,当前左边小朋友的分数大于右边一个小朋友的分数时,且此时左边小朋友的糖果数量不大于右边的,这个很重要,举个例子,当左边小朋友比右边小朋友高分时,若此时左边小朋友有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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值