【leetcode】candy

本文介绍了一种算法,用于解决如何给孩子们最少数量的糖果,同时确保得分高的孩子比邻居得到更多糖果的问题。通过两次遍历评分表,首先从左到右确保评分高的孩子比左侧孩子糖果多,然后从右到左调整确保右侧条件同样满足。
摘要由CSDN通过智能技术生成

题目:

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?


题目解析:

有N个孩子站在一条线上。每个孩子都被赋予一个评分值。

你正在给这些孩子们送糖果,这些孩子受到以下要求:

每个孩子至少要有一个糖果。

得分较高的孩子比他们的邻居得到更多的糖果。

你必须给的最小糖果是多少?


解决方案:

每个孩子的评分高的话,就要大于旁边的孩子的 糖果数 ;

那么我们可以现将所有孩子的糖果数    都算成是1;

从左到右开始遍历一遍这个评分表,要是当前孩子的评分高于左边的孩子,那么他的糖果数就等于左边孩子的糖果数 +1;

再从右到左遍历 评分表,要是当前的孩子的评分高于右边的孩子,并且分配到的糖果数还小于等于右边的孩子 ,那么他的糖果数就等于  右边孩子的糖果数+1;

这样就合理解决了上述的问题:

代码实现:

class Solution {
public:
    int candy(vector<int> &ratings) {
        int  n =  ratings.size();
        //要是当前的孩子数为 0 
        if(n == 0)
            return  0;
        //孩子数为 1
        if(n== 1)
            return 1;
        //size保存的是  每个孩子糖果的个数
        vector<int> size;
        size.resize(n,1);
        //从左到右遍历
        for(int i = 1;i < n ;++i)
        {
            //要是当前的孩子的评分高于 左边的孩子
            if(ratings[i] > ratings[i-1])
            {
                //糖果的个数 +1;
                size[i] = size[i-1]+1;
            }
        }
        //从右向左遍历 
        for(int i = n-1;i > 0  ;--i)
        {
            //要是当前的孩子的评分 盖于右边的孩子,且 糖果数还<= 右边的孩子
            if(ratings[i-1] > ratings[i]&&size[i-1] <=size[i])
            {
                size[i-1] = size[i]+1;
            }
        }
        int ret= 0 ;
        for(int i = 0 ;i < n;++i)
            {ret+= size[i];}
        return ret;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值