135. 分发糖果 -力扣(leetCode)c++贪心算法

  1. 分发糖果
    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
    你需要按照以下要求,帮助老师给这些孩子分发糖果:
    每个孩子至少分配到 1 个糖果。
    评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。
    那么这样下来,老师至少需要准备多少颗糖果呢

示例 1:
输入:[1,0,2]
输出:5
解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:[1,2,2]
输出:4
解释:你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

分析:这是一道难度困难的贪心算法题型(至少准备多少个),既然题目要求评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果,
那么说明我可以先从左往右遍历,如果右边孩子评分大于左边,那么该孩子糖果数+1;
然后从右往左再遍历,首先需要满足上面的条件(即右边糖果数大于左边),然后再该前提下继续进行跟上面一样的从右往左遍历,如果该孩子评分高于右边,那么该孩子糖果数与其右边孩子糖果数+1取大的那个值即可

代码如下:

class Solution {
public:
    int candy(vector<int>& ratings) {
        if(ratings.size()<2)
            return ratings.size();
        vector<int>a1(ratings.size(),1);
        
        int i=0;
        for(i=0;i<ratings.size()-1;i++)
        {
            if(ratings[i+1]>ratings[i])//从左往右遍历保证每个比左边高分的孩子获得的糖果比左边的孩子多
                a1[i+1]=a1[i]+1;
            
                
        }
        for(i=ratings.size()-1;i>0;i--)
        {
            if(ratings[i-1]>ratings[i])//从右往左遍历,在保证比左边大的情况下,比较现在的和右边的+1谁大
                a1[i-1]=max(a1[i]+1,a1[i-1]);
        }
        return accumulate(a1.begin(),a1.end(),0);
    }
};




觉得该篇文章有用的请不要忘记忘记点击右下角的大拇指~

欢迎大家关注我的公众号:Smooth前端成长记录
公众号同步更新CSDN博客内容,想方便阅读博客的C友可以来关注我的公众号以便获得更优良的阅读体验~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值