首页 > 其他分享 >135. 分发糖果【 力扣(LeetCode) 】

135. 分发糖果【 力扣(LeetCode) 】

时间:2024-08-04 17:25:10浏览次数:19  
标签:ratings 135 int 孩子 力扣 邻居 小朋友 糖果 LeetCode

一、题目描述

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

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

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

  请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

二、测试用例

示例 1:

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

示例 2:

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

三、解题思路

  1. 基本思路:
      对于每个孩子来说,他获得的糖果数取决于它的邻居,那就可以分解为两种情况,一种是相对于左邻居来确定他的糖果数,另一种是相对于右邻居来确定他的糖果数,这两种情况要同时满足,则要取两种情况最大的糖果数。【反证法:如果取小的那个,他只能满足一种情况,例如:相对于左邻居,他应该是 4 颗,相对于右邻居,他应该是 5 颗,如果我们取 4 颗,他就无法满足右邻居的情况】
  2. 具体思路:
    • 定义相对左右邻居糖果数序列 L 和 R,初始化都为 1 ;定义总糖果数 sum ,初始化为 0 ;
    • 计算左邻居序列:从头到尾,对于第 i 个小朋友来说,如果他比他的左邻居大,那他的糖果数就要比他的左邻居多 1 颗;否则,那他就只有最低的 1 颗糖果。【只有 1 颗糖果才能保证他一定比他的左邻居小,因为每个小朋友最少获得 1 颗】
    • 计算右邻居序列:从尾到头,对于第 i 个小朋友来说,如果他比他的右邻居大,那他的糖果数就要比他的右邻居多 1 颗,否则,那他就只有最低的 1 颗糖果。
    • 计算总糖果数:累加每个小朋友的糖果数,对于第 i 个小朋友来说,他的糖果数要取 L[i]R[i] 最大的一个。【解释:对于每个小朋友来说,他与邻居的关系就四种情况,分别是 L<M<R ,L<M>R ,L>M<R ,L>M>R
      • L<M<R :M 的相对左邻居糖果数就是 L+1,相对右邻居糖果数就是 1 ,则 M 的糖果数为 L+1;(满足 L<M ,也满足 M<R ,因为对于 R 来说,他的相对左邻居糖果数是 M+1=L+1+1,相对右邻居不知道,但是取相对左右邻居的最大,所以他的糖果数一定大于等于左邻居糖果数 L+2 。)
      • L<M>R :M 相对 L 和 R 是最大值,最大的最大,肯定是最大,肯定满足 L<M 和 M>R ;
      • L>M<R :M 相对 L 和 R 是最小值,M 的相对左右邻居糖果数都是 1,所以 M 的糖果数是 1 。【每个小朋友最少分的 1 颗糖果】
      • L>M>R :第一种情况的方向

四、参考代码

时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( n ) \Omicron(n) O(n)

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n=ratings.size();
        vector<int> L(n,1),R(n,1);
        int sum=0;

        for(int i=1;i<n;i++){
            if(ratings[i]>ratings[i-1]){
                L[i]=L[i-1]+1;
            }
            if(ratings[n-i-1]>ratings[n-i]){
                R[n-i-1]=R[n-i]+1;
            }
        }
        for(int i=0;i<n;i++){
            sum+=max(L[i],R[i]);
        }
        return sum;
    }
};

标签:ratings,135,int,孩子,力扣,邻居,小朋友,糖果,LeetCode
From: https://blog.csdn.net/yyh520025/article/details/140907259

相关文章

  • 【LeetCode:3. 无重复字符的最长子串 + 滑动窗口】
    ......
  • LeetCode | 141 linked list cycle
    https://github.com/dolphinmind/datastructure/tree/datastructure-linkedlist分析证明过程基本假设假设环的长度为(C)假设从链表的头部到环的入口点的距离为(A)假设从环的入口点到快慢指针第一次相遇点的距离为(B)假设从快慢指针第一次相遇点回到环的入口点的距离为(C......
  • LeetCode 75 颜色分类
    题目描述给定一个包含红色、白色和蓝色、共n个元素的数组nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数0、1和2分别表示红色、白色和蓝色。必须在不使用库内置的sort函数的情况下解决这个问题。思路可以使用单个指......
  • 「LeetCode Top100」之哈希篇
    1.两数之和题目链接:https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked解题状态:通过标签:数组、哈希表思路:通过创建一个哈希表来保存数组中的元素,每当遍历一个元素时,若哈希表中不存在另一个与之相加为目标值的元素,就将元素插入......
  • LeetCode 1387. Sort Integers by The Power Value
    原题链接在这里:https://leetcode.com/problems/sort-integers-by-the-power-value/description/题目:Thepowerofaninteger x isdefinedasthenumberofstepsneededtotransform x into 1 usingthefollowingsteps:if x iseventhen x=x/2if x is......
  • 【leetcode详解】另一棵树的子树 (C++递归:思路精析&& 过程反思)
    思路详解:总体框架:对root树进行先序遍历,如果当前结点(记为cur)的值和subRoot的根节点值相等时,就开始判断 以cur为根节点的树和子树是否结构一样?如何判断两棵树是否结构完全相同?分析:一提到“树”结构,很容易想到在(先/中/后序)遍历上做文章,请教了AI后笔者得知,如果两棵树......
  • 算法力扣刷题记录 六十四【216.组合总和III】
    前言回溯第二篇。回顾:上一篇学了回溯的基础知识和模版;组合练习题一应用了一次模版。本文继续组合问题练习:记录六十四【216.组合总和III】。一、题目阅读找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效......
  • 算法力扣刷题总结篇 ——【五】二叉树章节
    前言从记录三十五【二叉树基础和递归遍历】到记录六十二【538.把二叉搜索树转换为累加树】28篇文章都是二叉树的章节。所以总结的任务量有点大啊。但还是要做的。完成之后,开启新章节……继续。一、题目回顾1-5:遍历方式模版题。6-14:确定遍历顺序。后序居多——先统......
  • 【每日一题】【并查集】【力扣】695.岛屿的最大面积 C++
    力扣695.岛屿的最大面积695.岛屿的最大面积题目描述给你一个大小为m×nm\timesnm×n的二进制矩阵......
  • leetcode数论(2521. 数组乘积中的不同质因数数目)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给你一个正整数数组......