C++实现LeetCode(135.分糖果问题)

这篇文章主要介绍了C++实现LeetCode(135.分糖果问题),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

C++实现LeetCode(135.分糖果问题),久久派带你了解更多相关信息。

[LeetCode] 135.Candy 分糖果问题

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?

这道题看起来很难,其实解法并没有那么复杂,当然我也是看了别人的解法才做出来的,先来看看两遍遍历的解法,首先初始化每个人一个糖果,然后这个算法需要遍历两遍,第一遍从左向右遍历,如果右边的小盆友的等级高,等加一个糖果,这样保证了一个方向上高等级的糖果多。然后再从右向左遍历一遍,如果相邻两个左边的等级高,而左边的糖果又少的话,则左边糖果数为右边糖果数加一。最后再把所有小盆友的糖果数都加起来返回即可。代码如下:

解法一:

class Solution {public:    int candy(vector<int>& ratings) {        int res = 0, n = ratings.size();        vector<int> nums(n, 1);        for (int i = 0; i < n - 1; ++i) {            if (ratings[i + 1] > ratings[i]) nums[i + 1] = nums[i] + 1;        }        for (int i = n - 1; i > 0; --i) {            if (ratings[i - 1] > ratings[i]) nums[i - 1] = max(nums[i - 1], nums[i] + 1);        }        for (int num : nums) res += num;        return res;    }};

下面来看一次遍历的方法,相比于遍历两次的思路简单明了,这种只遍历一次的解法就稍有些复杂了。首先我们给第一个同学一个糖果,那么对于接下来的一个同学就有三种情况:

1. 接下来的同学的rating等于前一个同学,那么给接下来的同学一个糖果就行。

2. 接下来的同学的rating大于前一个同学,那么给接下来的同学的糖果数要比前一个同学糖果数加1。

3.接下来的同学的rating小于前一个同学,那么我们此时不知道应该给这个同学多少个糖果,需要看后面的情况。

对于第三种情况,我们不确定要给几个,因为要是只给1个的话,那么有可能接下来还有rating更小的同学,总不能一个都不给吧。也不能直接给前一个同学的糖果数减1,有可能给多了,因为如果后面再没人了的话,其实只要给一个就行了。还有就是,如果后面好几个rating越来越小的同学,那么前一个同学的糖果数可能还得追加,以保证最后面的同学至少能有1个糖果。来一个例子吧,四个同学,他们的rating如下:

1 3 2 1

先给第一个rating为1的同学一个糖果,然后从第二个同学开始遍历,第二个同学rating为3,比1大,所以多给一个糖果,第二个同学得到两个糖果。下面第三个同学,他的rating为2,比前一个同学的rating小,如果我们此时给1个糖果的话,那么rating更小的第四个同学就得不到糖果了,所以我们要给第四个同学1个糖果,而给第三个同学2个糖果,此时要给第二个同学追加1个糖果,使其能够比第三个同学的糖果数多至少一个。那么我们就需要统计出多有个连着的同学的rating变小,用变量cnt来记录,找出了最后一个减小的同学,那么就可以往前推,每往前一个加一个糖果,这就是个等差数列,我们可以直接利用求和公式算出这些rating减小的同学的糖果之和。然后我们还要看第一个开始减小的同学的前一个同学需不需要追加糖果,只要比较cnt和pre的大小,pre是之前同学得到的最大糖果数,二者做差加1就是需要追加的糖果数,加到结果res中即可,参见代码如下:

解法二:

class Solution {public:    int candy(vector<int>& ratings) {        if (ratings.empty()) return 0;        int res = 1, pre = 1, cnt = 0;        for (int i = 1; i < ratings.size(); ++i) {            if (ratings[i] >= ratings[i - 1]) {                if (cnt > 0) {                    res += cnt * (cnt + 1) / 2;                    if (cnt >= pre) res += cnt - pre + 1;                    cnt = 0;                    pre = 1;                }                pre = (ratings[i] == ratings[i - 1]) ? 1 : pre + 1;                res += pre;            } else {                ++cnt;            }        }             if (cnt > 0) {            res += cnt * (cnt + 1) / 2;            if (cnt >= pre) res += cnt - pre + 1;        }        return res;    }};

参考资料:

****/d/file/p/2021072818002578425/2021072818002578426

****/d/file/p/2021072818002678427/2021072818002678428

****/d/file/p/2021072818002778429/2021072818002778430

到此这篇关于C++实现LeetCode(135.分糖果问题)的文章就介绍到这了,更多相关C++实现分糖果问题内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/7259.html

(0)
nan
上一篇 2021-07-29
下一篇 2021-07-29

相关推荐

  • 坐飞机也要称体重 新西兰航空登机前将给国际旅客称重 !

    坐飞机也要称体重了,你能接受吗?6月1日消息,据报道,新西兰民航局要求新西兰航空,在接下来五周内,对从奥克兰国际机场出发的国际航班上的乘客及其行李进行称重。报道称,旅客在办理登机手续时将被要求站在一个数字秤上,为了保护个人隐私,他们的体重信息将匿名记录在后台,称重也不会显示体重。调查乘客体重是收集飞

    热点头条 2023-06-02
    0
  • 2021广州国庆节天气怎么样(局部雷雨多发体感闷热)

    近来,广东“秋老虎”横行,所以气温比较高,包括广州在内,高温频繁出现。眼看国庆节就要到了,天气太热自然是会影响到游玩体验,那么,具体2021广州国庆节天气怎么样呢?有没有高温出没呢?根据最新预报显示,预计局部雷雨多发体感闷热,注意防暑防晒。

    2021-09-27
    0
  • “三桶油”去年日赚9.79亿!中国海油利润翻一番 !

    最近,中国石化、中国石油、中国海油相继发布了2022年财报,“三桶油”合计实现净利润3573.82亿元,平均日赚9.79亿元,并且相比2021年增加了约53%!中国石化收入最高达到33181.68亿元,同比增加21.06%,官方称主要归因于石油石化产品价格同比上涨;净利润663.02亿元,同比下滑6

    热点头条 2023-03-30
    0
  • 霜降节气吃什么食物养生(什么食物经过霜降后会更好吃)

    导读:吃着养生是一个非常不错的办法,也是人们最喜欢的养生方式,每个节气养生方法各不同,养生食物也不一样,那么霜降节气吃什么食物养生呢?若是问你什么食物经过霜降后会更好吃

    2021-10-07 热点头条
    0
  • 是谁推高了榴莲价格?网友吐槽吃不起 动辄三四百块一个 有人热衷开盲盒 !

    5月开始进入了榴莲的销售旺季,此前还有预测五一之后榴莲价格将会腰斩,从20多块跌到10多块一斤,然而实际情况相反,榴莲价格不降反增,现在轻松突破40元以上,榴莲贵、涨价一事频频上热搜。在电商平台上,常见的泰国金枕头榴莲,4斤左右的普遍在200-250元左右,知名品牌的如马来西亚山猫王榴莲,4斤左右的

    热点头条 2023-05-28
    0
  • 今北京天气仍较晴好(明后天又将迎降水)

    昨日(21日)是中秋节,北京天气晴好,可以赏到又圆又亮的月亮。而根据最新预报显示,预计今北京天气仍较晴好,所以仍旧能赏到圆月。不过,明后天又将迎降水,雨水将会给我们带来明显的凉意,“一场秋雨一场寒”的感觉即将上线。

    2021-09-22
    0

发表回复

登录后才能评论