leetcode-5.17-贪心(135)

135. 分发糖果

  解法一:两遍遍历,从左向右与从右往左

class Solution {
public:
    int candy(vector<int>& ratings) {
        int N = ratings.size();
        vector<int>candies(N,1);
        int mycandies = 0 ;
        //左规则
        for(int i=1;i<N;i++){
            if(ratings[i]>ratings[i-1]){
                candies[i]=candies[i-1]+1;
            }
        }
        //右规则
        for(int i=N-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]&&candies[i]<=candies[i+1]){
                candies[i]=candies[i+1]+1;
            }
        }
        for(int i=0;i<N;i++)
            mycandies += candies[i];    
        return mycandies;
    }
};

解法二:暴力

 

class Solution {
public:
    int candy(vector<int>& ratings) {
        int N = ratings.size();
        
       
        int mycandies = 1 ; //返回值
        int len1 = 1,len2 = 0;//当前递增和递减长度
        int candies = 1;//上一个儿童的糖果数目。
        for(int i=1;i<N;i++){
            if(ratings[i]>=ratings[i-1]){ //当前不比上一个儿童矮
                candies = (ratings[i]==ratings[i-1]?1:candies+1); //如果相等为1,否则加1
                mycandies+=candies;//加上当前位置的糖果
                len2 = 0;//递减为0
                len1 = candies;//递增长度为此时的糖果数
            }
            else{
                len2++;//递减+1 相等于递减时 最大元素的糖果数+1 当前为1
                if(len2 == len1) len2++;  //递增和递减长度决定了递增或者递减时最大的数目,相等说明要把递增的最后一个糖果数+1  
                mycandies+= len2; //加上此时的糖果数
                candies = 1;//当前糖果数为1
            }
        }
           
        return mycandies;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值