LeetCode135—Candy

本文探讨了一个经典的算法问题——如何以最少的糖果数满足一群孩子的需求,确保等级高的孩子获得的糖果比邻居多。通过两次遍历的方法高效解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题

原题链接

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个小孩,每个小孩有一个等级,且每个小孩的等级如果比他临近的小孩高,那么他将得到更多的糖果。
求最少需要多少糖果才能满足上述要求,且每个小孩至少一个糖果。

模拟这个过程,可能会想到:
求最少需要多少糖果,先每个人分配一个,再根据等级依次加一个糖果。

但上述思路是会有问题的,那就是对于小孩 i 来说,假设他的等级既高于小孩i1又高于小孩 i+1 ,那么他得到的糖果就要比小孩 i1 和小孩 i+1 的糖果中的较多者要多一个,这样看的话一次循环可能搞不定,因为第一次循环中在计算第 i 个小孩的糖果时,第i+1个小孩的数据还没出来呢。

因此两次循环,一次从左到右,一次从右往左。


代码

class Solution {
public:
    int candy( vector <int>& ratings)
        {
            int N= ratings.size();
            vector<int>count(N,1);
            for(int i=1;i<ratings.size();i++)
            {
                if(ratings[i]>ratings[i-1])
                    count[i]=count[i-1]+1;
            }
            for(int i=N-1;i>0;i--)
            {
                if(ratings[i]<ratings[i-1])
                {
                    count[i-1]=max(count[i]+1,count[i-1]);
                }
            }
            return accumulate(count.begin(),count.end(),0);
        }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值