力扣刷题记录83.1-----135. 分发糖果


一、题目

在这里插入图片描述

二、代码

class Solution 
{
public:
    //版本1.0  :遗憾的是 暴力解法失败了
    //局部最优
    //除了基本逻辑  我觉得 一轮一轮顺着发糖果效率更高  不用去找全局最小值
    // int candy(vector<int>& ratings)
    // {
    //     int i,j;
    //     vector<int> candys;
    //     int operation_flag=1;
    //     int return_num=0;

    //     if(ratings.size()==1) return_num=1;
    //     else
    //     {
    //         for(i=0;i<ratings.size();i++) candys.push_back(1);   //第一轮保证每一个孩子至少有一个糖果
            
    //         //每一轮补发糖果  直到不再需要补发未知
    //         while(operation_flag)
    //         {
    //             operation_flag=0;   //每一轮开始清零
    //             for(i=0;i<candys.size();i++)   //补发糖果操作
    //             {

    //                 if(i==0)
    //                 {
    //                     if(ratings[0]>ratings[1]&&candys[0]<=candys[1])   //评分高 糖果小于等于
    //                     {
    //                         candys[0]++;
    //                         operation_flag=1;
    //                     }
    //                 }
    //                 else if(i==candys.size()-1)
    //                 {
    //                     if(ratings[candys.size()-1]>ratings[candys.size()-2]&&candys[candys.size()-1]<=candys[candys.size()-2])
    //                     {
    //                         candys[candys.size()-1]++;
    //                         operation_flag=1;
                            
    //                     }
    //                 }
    //                 else
    //                 {
    //                     if( (ratings[i]>ratings[i-1]&&candys[i]<=candys[i-1]) || (ratings[i]>ratings[i+1]&&candys[i]<=candys[i+1])     )
    //                     {
    //                          candys[i]++;
    //                          operation_flag=1;
    //                     }
    //                 }

    //             }
    
    //         }
    //         for(i=0;i<candys.size();i++) return_num+=candys[i];

    //     }

        
    //     return return_num;
    // }



    //左边扫一次 右边扫一次  
    //核心:第二轮只是补充关系 不破坏稳定性
    int candy(vector<int>& ratings)
    {
        int i,j;
        int return_num=0;
        vector<int> candys(ratings.size(),1);

        //for(i=0;i<ratings.size();i++)    candys.push_back(1);
         
        for(i=1;i<candys.size();i++)   //左侧
        {
            if(ratings[i]>ratings[i-1])
            {
              candys[i]=candys[i-1]+1;
            }
        }

        for(i=candys.size()-2;i>=0;i--)  //右侧
        {
            if(ratings[i]>ratings[i+1])
            {
              candys[i]=max(candys[i],candys[i+1]+1);
            }
        }

        //for(i=0;i<candys.size();i++)         std::cout<<"  "<<candys[i];
        //std::cout<<std::endl;

        for(i=0;i<candys.size();i++) return_num+=candys[i];

        return return_num;
       
    }
};

三、运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值