首页 > 其他分享 >LeetCode135. 分发糖果

LeetCode135. 分发糖果

时间:2024-07-25 17:10:43浏览次数:15  
标签:分发 右边 ratings 孩子 candycount LeetCode135 糖果 我们

题目链接:https://leetcode.cn/problems/candy/description/

题目叙述:

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 * 10^4
0 <= ratings[i] <= 2 * 10^4

思路

这题我们可以采用贪心的思想,如果想让所有孩子分到的糖果的总数量最小的话,我们可以先给所有孩子每人发一颗糖果,然后从第二个孩子开始,我们依次与左边的人进行比较,看看是否比左边的人评分高

如果比左边的人评分高的话,我们就把这个孩子的糖果赋值为左边孩子的糖果数量+1,因为我们一定要比评分低的人的数量至少多1嘛!对吧,所以说我们有了这个式子: candycount[i]=candycount[i-1]+1;

这个阶段的代码如下:

        vector<int> candycount(ratings.size(),1);
        //跟左边的孩子进行比较
        for(int i=1;i<ratings.size();i++){
            //比左边孩子的评分高,那么我们就将这个地方赋值为左边孩子糖果数量+1
            if(ratings[i]>ratings[i-1]){
                candycount[i]=candycount[i-1]+1;
            }
        }

解决完左边以后,我们是不是还没有满足题目的要求啊?因为题目说所有孩子要比相邻两个孩子分到的糖果数量要多,那么我们现在只是解决了所有孩子比左边那个孩子的糖果数量要多,对吧?那么

我们还需要处理一个逻辑,就是我们要和右边孩子进行比较,我们如果评分比右边孩子要高的话,我们就得比右边的孩子的糖果数量至少要多一个,此时我们赋值的条件就不是简单的

candycount[i]=candycount[i-1]+1;了,因为我们本身的糖果就有可能比右边的孩子的糖果数量要多,对吧?所以说我们得取二者中较大的那一个

这段代码如下:

       //跟右边的孩子进行比较
        for(int i=ratings.size()-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                //这里得注意了,可能我们比右边的孩子评分高,但是我们可能本来就比右边孩子
                //糖果的数量+1就要多,因此我们需要对原本我们糖果的数量和右边孩子糖果的数量+1
                //这两个值取一个最大的。
                candycount[i]=max(candycount[i+1]+1,candycount[i]);
            }
        }

做完这两步以后,我们就能够保证在评分高的情况下(相较于相邻两个孩子),我们就保证了至少比他们的糖果数量要多一个。

整体代码如下:

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> candycount(ratings.size(),1);
        //跟左边的孩子进行比较
        for(int i=1;i<ratings.size();i++){
            //比左边孩子的评分高,那么我们就将这个地方赋值为左边孩子糖果数量+1
            if(ratings[i]>ratings[i-1]){
                candycount[i]=candycount[i-1]+1;
            }
        }
        //跟右边的孩子进行比较
        for(int i=ratings.size()-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                //这里得注意了,可能我们比右边的孩子评分高,但是我们可能本来就比右边孩子
                //糖果的数量+1就要多,因此我们需要对原本我们糖果的数量和右边孩子糖果的数量+1
                //这两个值取一个最大的。
                candycount[i]=max(candycount[i+1]+1,candycount[i]);
            }
        }
        //最后把所有孩子的糖果加起来就行
        int result=0;
        for(int a:candycount) result+=a;
        return result;
    }
};

思考与总结:

这道题目实际上告诉我们一个道理,当我们有左右两个边界需要处理时,我们一定不能同时兼顾两个边界,这样就会顾此失彼!最后的结果就是两边都得不到想要的结果。

如果这篇文章帮助到你了的话,能不能动动小指头点个推荐呢?你的推荐就是我更新的最大动力!

标签:分发,右边,ratings,孩子,candycount,LeetCode135,糖果,我们
From: https://www.cnblogs.com/Tomorrowland/p/18323659

相关文章

  • LeetCode455.分发饼干
    LeetCode题目链接:https://leetcode.cn/problems/assign-cookies/description/题目叙述假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • P3275 [SCOI2011] 糖果
    原题链接题解缩点+差分约束,求最小值故跑最长路无解的情况:存在正权环,由于是有向图,所以环上的元素在一个强连通分量内,判断强连通分量内存不存在有正权值的边,然后缩点,拓扑跑一圈缩点时要一个超级源点就可以只dfs一次了code#include<bits/stdc++.h>usingnamespacestd;#def......
  • 代码随想录算法训练营第31天 | 贪心3:134.加油站、135.分发糖果、860.柠檬水找零、406.
    代码随想录算法训练营第31天|贪心3:134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列134.加油站https://leetcode.cn/problems/gas-station/description/代码随想录https://programmercarl.com/0134.加油站.html135.分发糖果https://leetcode.cn/problems......
  • 代码随想录算法训练营第29天 | 贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和
    代码随想录算法训练营第29天|贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和贪心算法基础理论https://programmercarl.com/贪心算法理论基础.html455.分发饼干https://leetcode.cn/problems/assign-cookies/description/代码随想录https://programmercarl.com/0455......
  • 代码随想录day28 分发饼干 | 摆动序列 | 最大子序和
    分发饼干分发饼干解题思路用贪心算法,胃口最大的孩子就需要尺寸最大的饼干,如果没有符合条件的饼干则换胃口第二大的孩子,以此类推。局部最优就是全局最优。知识点贪心心得简单摆动序列摆动序列解题思路通过遍历整个数组找到峰值,峰值则是找到最长的子序列,局部最优就是全......
  • C++题解(6) 信息学奥赛一本通:2069:【例2.12 】糖果游戏
    【题目描述】某幼儿园里,有5个小朋友编号为1、2、3、4、5,他们按自己的编号顺序围坐在一张圆桌旁。他们身上都有若干个糖果(键盘输入),现在他们做一个分糖果游戏。从1号小朋友开始,将自己的糖果均分三份(如果有多余的糖果,则立即吃掉),自己留一份,其余两份分给他的相邻的两个小朋友。......
  • 【题解】 [CSP-J 2021 T1] 分糖果
    题目描述题目大意给定正整数\(n\)、\(L\)、\(R\),求\(\max_{i\in\left[L,R\right]}{i\bmodn}\)。思路题目主要考察:分类讨论。众所周知,对于\(\forallx\),有$(x\bmodn)\in\left[0,n-1\right]$。可以分为两种情况讨论:如果\(\left\lfloor\frac{L......
  • Qt-事件过滤器、事件分发器、事件处理器
    前言Qt中事件的处理步骤1.当事件产生之后,Qt应用程序对象通过调用QApplication::notify()函数将事件发送到指定的窗口。2.事件在发送过程中可以通过向对象(窗口、按钮等)安装事件过滤器QObject::eventFilter()来对事件进行过滤。Qt应用程序默认不对任何产生的事件......
  • CDN在App分发中的作用
    CDN(ContentDeliveryNetwork,内容分发网络)在App分发中扮演着至关重要的角色。它通过一系列技术手段,将App的内容高效、快速地传递给用户,显著提升用户体验和下载速度。以下是CDN在App分发中的具体作用和优势:一、CDN在App分发中的作用提升下载速度:CDN分发系统能够将App的内容储存......