首页 > 编程语言 >【算法基础】贪心算法 LeetCode 135. 分发糖果

【算法基础】贪心算法 LeetCode 135. 分发糖果

时间:2023-11-14 22:01:12浏览次数:46  
标签:分发 遍历 ratings int 孩子 算法 135 糖果 LeetCode

分发糖果

题目介绍

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

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

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

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

测试用例

【算法基础】贪心算法 LeetCode 135. 分发糖果_初始化

算法思想:

分发糖果是贪心算法思想的典型例题。根据题意我们可以进行如下解读。分发糖果的要求就只有两个。首先是每个孩子至少分配到一个糖果。那么我们在初始化答案数组的时候是需要将初始化的值全部初始化为1。其次第二要求是相邻两个孩子评分更高的孩子会获得更多的糖果。那么相邻之间如何判断,我们可以通过测试用例发现就是第i位的糖果个数受左右两边的影响。所以肯定是不能在一次遍历就能将所以情况进行判断处理。所以和前缀和的思想差不多的,正反都进行一次遍历将所有情况取最大值,那么就是我们需要分发的糖果。

为什么是正反都进行一次遍历判断呢?

首先我们进行正向遍历的时候,判断如果右边ratings[i]>rating[i-1]那么,v[i]=v[i-1]+1,这里是符合分发要求的,与此同时这个肯定也是不全面的,会漏掉,左边比右边大情况,答案数组没有+1进行更新。

【算法基础】贪心算法 LeetCode 135. 分发糖果_初始化_02


然后我们进行反向的遍历,解决 1比0大 却分发的糖果数都是1,还有最后4,3,2的不符合分发糖果要求的情况。

【算法基础】贪心算法 LeetCode 135. 分发糖果_数组_03


源代码

class Solution {
public:
    int candy(vector<int>& ratings) {
        //正反都遍历一遍
        vector<int> v(ratings.size(),1);
        for(int i=1;i<ratings.size();i++)
        {
            if(ratings[i]>ratings[i-1])
            {
                v[i]=v[i-1]+1;
            }
        }
        //反过来
        for(int i=ratings.size()-2;i>=0;i--)
        {
            if(ratings[i]>ratings[i+1])
            {
                v[i]=max(v[i+1]+1,v[i]);
            }
        }
        int sum=0;
        for(auto x:v)
        {
            sum+=x;
        }
        return sum;
    }
};


【算法基础】贪心算法 LeetCode 135. 分发糖果_贪心算法_04



标签:分发,遍历,ratings,int,孩子,算法,135,糖果,LeetCode
From: https://blog.51cto.com/u_15831056/8379524

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (135)-- 算法导论11.3 1题
    一、用go语言,假设我们希望查找一个长度为n的链表,其中每一个元素都包含一个关键字k并具有散列值h(k)。每一个关键字都是长字符串。那么在表中查找具有给定关键字的元素时,如何利用各元素的散列值呢?文心一言:在Go语言中,你可以通过使用一个哈希表来存储关键字的散列值,并在查找具有给......
  • 不平衡数据集神经网络回归SMOTE、SMOGN算法:R语言代码
      本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。  在之前的文章SMOGN算法的Python实现:不平衡数据的深度学习回归中,我们介绍了基于Python语言中的smogn包,实现SMOGN算......
  • 文心一言 VS 讯飞星火 VS chatgpt (135)-- 算法导论11.3 1题
    一、用go语言,假设我们希望查找一个长度为n的链表,其中每一个元素都包含一个关键字k并具有散列值h(k)。每一个关键字都是长字符串。那么在表中查找具有给定关键字的元素时,如何利用各元素的散列值呢?文心一言:在Go语言中,你可以通过使用一个哈希表来存储关键字的散列值,并在查找具有......
  • 平方根倒数快速算法
    平方根是什么?给定一个x,我想算x^(1/2),就是在算平方根在计算机里最常见的算法是牛顿迭代法牛顿迭代法平方根倒数是什么?给定一个x,我想算x^-(1/2),就是在算平方根的倒数平时我们是如何计算的?如果在纸上写,就是一步一步的算,先算平方根(一般就是查表法),再求倒数;但是大部分的数是无......
  • TSINGSEE视频汇聚管理与AI算法视频质量检测方案
    一、建设背景随着互联网视频技术的发展,视频监管在辅助安全生产、管理等方面发挥了不可替代的作用。但是,在监管场景中,仍然存在视频掉线、视频人为遮挡、视频录像存储时长不足等问题,对企业的日常管理和运转存在较大的安全隐患。企业原有视频运维系统存在检测准确率低、告警提醒滞后......
  • Java非对称加密RSA算法
    简介:公开密钥密码学(英语:Public-keycryptography)也称非对称式密码学(英语:Asymmetriccryptography)是密码学的一种算法。加密与解密使用不同的密钥,其中一个称之为公钥,对外公开,通常用于数据加密。另一个称之为私钥,是不能对外公布的,通常用于数据解密,这样使用公钥加密的数据即使被......
  • 视频质量AI检测算法与LiteCVR视频质量诊断方案介绍
    LiteCVR视频质量诊断方案可以实现对监控设备常见的异常抖动、画面条纹、画面模糊、偏色、亮度异常、对比度异常、冻结、丢失、噪声等机器故障及恶意遮挡、恶意变化监控场景的行为做出准确判断,还可以对监控设备因为网络异常等原因导致的设备断线、取流异常、码率是否达标等问题进行......
  • JVM之垃圾回收算法
    1.概述在JVM中,最大的亮点就是自动垃圾回收机制,那它是根据什么依据来判断是垃圾的呢,又是根据什么算法来回收垃圾的呢?不同的垃圾回收算法有不同的特点和应用场景,本文整理了JVM常见的几种垃圾回收算法,以及其优缺点和适用场景供读者参考。不熟悉JVM内存模型的可先参考如下这篇文章(......
  • Python冒泡排序算法
    冒泡排序算法是一种简单的排序算法,其基本思想是通过多次遍历数组,比较相邻的两个元素,如果它们的顺序不对则交换。这样一轮遍历之后,最大(或最小)的元素就会被移动到数组的最后,然后再对剩余的元素进行类似的操作,直到整个数组有序defbubble_sort(arr):n=len(arr)#外层循环控制遍历的......
  • 反向传播算法代码
    importtorchimporttorch.nnasnnimporttorch.optimasoptimclassMLPModel(nn.Module):def__init__(self,input_size):super(MLPModel,self).__init__()self.fc1=nn.Linear(input_size,128)self.fc2=nn.Linear(128,64)......