首页 > 编程语言 >LeetCode135.分发糖果(C#)

LeetCode135.分发糖果(C#)

时间:2024-09-15 20:25:10浏览次数:15  
标签:分发 right ratings C# 孩子 int LeetCode135 糖果 left

题目描述:

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 * 104
  • 0 <= ratings[i] <= 2 * 104

思路:

依题意:“相邻两个孩子评分更高的孩子会获得更多的糖果”。我们可以把这个条件拆分为左相邻和右相邻。

先从左边遍历一次,如果ratings[i]>ratings[i-1],那么第i个小孩的糖果比i-1个小孩多一个,否则这个小孩糖果数量为1。用一个left数组记录从左边遍历时第i个小孩的最小糖果数量。那么这个逻辑可以表示为if(ratings[i]>ratings[i-1])left[i]=left[i-1]+1;else left=1;

然后从右往左遍历进行一次同样的操作,用right记录。

代码如下:

public class Solution {
    public int Candy(int[] ratings) {
        int ans=0;//答案
        int n=ratings.Length;
        int[] left=new int[n];//left表示从左往右遍历时第i个小孩的最少糖果数
        for(int i=0;i<n;i++){
            if(i>0&&ratings[i]>ratings[i-1]){
                left[i]=left[i-1]+1;
            }
            else{
                left[i]=1;
            }
        }
        int right=0;//这里可以只使用一个整型变量来存储,每一次循环进行判断
        for(int i=n-1;i>=0;i--){
            if(i<n-1&&ratings[i]>ratings[i+1]){
                right++;
            }
            else{
                right=1;
            }
            ans+=Math.Max(right,left[i]);
        }
        return ans;
    }
}

我这里right使用一个整型变量而非数组,是考虑到了第二次遍历可以直接得出答案了,就没必要把每一个位置的right存下来。

标签:分发,right,ratings,C#,孩子,int,LeetCode135,糖果,left
From: https://blog.csdn.net/m0_74081230/article/details/142288029

相关文章

  • C++ auto 类型推断注意的地方
    inti=0,&r=i;autoa=r;//a是一个整数(r是i的别名,而i是一个整数)intaauto一般会忽略掉顶层const(参见2.4.3节,第57页),同时底层const则会保留下来,比如当初始值是一个指向常量的指针时:constintci=i,&cr=ci;autob=ci;//b......
  • [Whole Web] Auto check application website's updates
    Inaproductionenvironment,wewanttoprompttheuserwithamessagewhennewscriptsareavailable,askingNewscriptsareavailable.Doyouwanttoupdate?Theideaisstraightforward:periodically(e.g.,everyminute,10seconds,dependsonyourcase......
  • Comsol中设置圆偏振
    文献来源:CircularDichroismMetamirrorswithNear-PerfectExtinction。添加图片注释,不超过140字(可选)通常来说,不管是金属反射镜还是布拉格反射镜,对圆偏振都没有选择效果,这是因为没有非对称结构的引入。而且,当入射到各向同性介质,反射光的相位差还是和原来一样,所以偏振面......
  • 总结:1037 - CSP 2021 提高级第一轮
    我的提交记录与结果以比较为基本运算,对于\(2n\)个数,同时找到最大值和最小值,最坏情况下需要的最小的比较次数为()。\(\textttA\).4n-2\(\textttB\).3n+1\(\color{#5eb95e}\texttt{C}\).3n-2\(\color{#e74c3c}\textttD\).2n+1【解析】:首先先将原数组两两分组。每组......
  • C语言一些简单的细节记录
    一、声明和定义的区别1.声明(Declaration):是告诉编译器有一个变量、函数或类型存在,但不为其分配内存或提供具体的实现。声明提供了有关标识符(如变量名、函数名)的信息,包括类型和名称。它们通常在头文件中出现,以便在多个源文件中共享。例如,以下是变量、函数和类型的声明示例:......
  • opencv学习:calcHist 函数绘制图像直方图及代码实现
    cv2.calcHist函数是OpenCV库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。函数语法hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate=False)......
  • C++的习题
    C++的习题类与对象习题1:(const成员函数)假设AA是一个类,AA*abc()const是该类的一个成员函数的原型。若该函数返回this值,当用x.abc()调用该成员函数后,x的值是()A.可能被改变B.已经被改变C.受到函数调用的影响D.不变A.此成员函数被定义为const常方法,代表在......
  • opencv学习:图像下采样和上采样及拉普拉斯金字塔
    图像下采样和上采样OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理功能,包括图像的上采样和下采样。下采样(Downsampling)下采样是减少图像分辨率的过程,通常用于图像压缩、图像分析等场景。在OpenCV中,下采样可以通过......
  • opencv学习:图像旋转的两种方法,旋转后的图片进行模板匹配代码实现
    图像旋转在图像处理中,rotate和rot90是两种常见的图像旋转方法,它们在功能和使用上有一些区别。下面我将分别介绍这两种方法,并解释它们的主要区别rot90 方法rot90方法是NumPy提供的一种数组旋转函数,它主要用于对二维数组(如图像)进行90度的旋转。这个方法比较简单,只支持9......
  • opencv学习:信用卡卡号识别
    该代码用于从信用卡图像中自动识别和提取数字信息。该系统将识别信用卡类型,并输出信用卡上的数字序列。1.创建命令行参数数字模板信用卡#创建命令行参数解析器ap=argparse.ArgumentParser()#添加命令行参数-i/--image,指定输入图像路径ap.add_argument("-i","--i......