Candy ---- LeetCode

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

解题思路:使用贪心算法

解法一:使用长度为ratings.length的数组存放每个小孩candy数,从前往后遍历ratings数组,若ratings[i]>ratings[i-1],则candy[i]=candy[i-1]+1,否则candy[i]=1。然后再从后往前遍历ratings,同时改变candy值。

public class Solution {
    public int candy(int[] ratings) {
         int count=ratings.length;
        int result=0;
        int [] candy=new int[count];
        candy[0]=1;
        for(int i=1;i<count;i++){
           if(ratings[i]>ratings[i-1]){
          candy[i]=candy[i-1]+1;           
           }else{
          candy[i]=1;
           }
        }
        for(int i=count-2;i>=0;i--){
        if(ratings[i]>ratings[i+1]){
        candy[i]=Math.max(candy[i+1]+1, candy[i]);
        }        
        }
        
    for(int i=0;i<count;i++){
    result+=candy[i];  
    }
   
    return result;
        
    }
}

解法二:使用变量sum记录candy总数,preCount记录前个小孩的candy数,maxCount记录递增序列的峰值,deLen记录递减序列长度。一次遍历ratings数组,若为递增,则每回当前candy数为前个小孩拿到的+1,即preCount+1,若当前ratings值与前一个相同则当前candy数为1,同时更新candy总数。若当前ratings值比前一个小则记录递增序列的峰值maxCount,同时递减序列长度deLen+1,更新candy总数sum=deLen.若峰值小于等于deLen,则maxCount++,同时sum++。最后输出sum。

public class Solution {
    public int candy(int[] ratings) {
        int sum=1;
        int preCount=1;
        int curCount=1;
        int maxCount=1;
        int desLen=0;
        
        for(int i=1;i<ratings.length;i++){
            if(ratings[i]>ratings[i-1]){
               curCount=preCount+1;  
               sum=sum+curCount;
               maxCount=curCount;
               preCount=curCount;
            }else if(ratings[i]==ratings[i-1]){
            sum=sum+1;
            maxCount=1;
                preCount=1;
            }else{
                while(i<ratings.length&&ratings[i]<ratings[i-1]){
                desLen++;
                if(maxCount<=desLen){
                maxCount++;
                sum++;
                }
                sum=sum+desLen;
            i++;
            }
                i=i-1;
           desLen=0; 
           preCount=1;
           maxCount=1;
            }
             
        }  
        
        return sum;
        
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值