Leetcode 135.分发糖果

题目要求

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例 1:

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:

输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
 

提示:

n == ratings.length
1 <= n <= 2 * 104
0 <= ratings[i] <= 2 * 104 

其实这里我并不是很明白为什么对数组进行两次循环的判断就好了,这个代码不是我自己写的,我个人对这个代码进行分析是,刚开始当考虑只右侧的人比左侧的人多的情况,然后再从右往左考虑一遍,不明白是怎么想先到这个思路的,如果是遍历一遍数组的时候,当右边大于左边时,右侧+1,那么当右边不大于左边的话是不是左边可以进行一个+1操作,但是如果此时左边又进行了一次+1操作的话,那么左边的左边是否又需要进行变换,这样的话就牵扯到了所有前面的元素,所以先整体从左往右考虑一次,然后再从右往左遍历一次,这样子就可以避免那种连锁反应。

class Solution {
public:
    int candy(vector<int>& r) 
    {
        //如果先对数组进行循环判断,当右边的人比左边的高,那么糖果数就是左边的+1
        //如果左边的更高,需不需要减一呢
        int len = r.size();
        //创建一个数组来记录每个位置上的人分别需要多少糖果,最后求和
        vector<int>arr(len,1);
        for(int i = 0;i<len-1;i++)
        {
            //如果左侧的人分数小于右侧的人,那么右侧的人糖果数+1
            if(r[i]<r[i+1])
            {
                arr[i+1] = arr[i]+1;
            }
        }
        for(int i = len-1;i>0;i--)
        {
            //从右往左判断,如果左侧的人分数高于右侧的人且此时左侧人的糖果数要少于右侧的人
            //如果出现在左侧的人分数比右侧高,但是糖果数要多于右侧的人
            //那么就表示这个人的糖果数不需要额外再加,因为同时满足多于两侧的人的糖果数
            if(r[i-1]>r[i] && arr[i-1]<=arr[i])
            {
                arr[i-1] = arr[i]+1;
            }
        }
        int count = 0;
        for(int i = 0;i<len;i++)
        {
            count += arr[i];
            // cout<<arr[i]<<"    ";
        }
        return count;
    }
};

以上代码纯属个人分析,如有好的思路或者想法,欢迎讨论交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值