分发糖果[困难]
优质博文:IT-BLOG-CN
一、题目
n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:
【1】每个孩子至少分配到1个糖果。
【2】相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目。
示例 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
二、代码
【1】两次遍历: 我们可以将「相邻的孩子中,评分高的孩子必须获得更多的糖果」这句话拆分为两个规则,分别处理。
左规则: 当ratings[i−1] < ratings[i]时,i号学生的糖果数量将比i−1号孩子的糖果数量多。
右规则: 当ratings[i] > ratings[i+1]时,i号学生的糖果数量将比i+1号孩子的糖果数量多。
我们遍历该数组两次,处理出每一个学生分别满足左规则或右规则时,最少需要被分得的糖果数量。每个人最终分得的糖果数量即为这两个数量的最大值。
具体地,以左规则为例:我们从左到右遍历该数组,假设当前遍历到位置i,如果有ratings[i−1] < ratings[i]那么i号学生的糖果数量将比i−1号孩子的糖果数量多,我们令left[i]=left[i−1] + 1即可,否则我们令left[i] = 1。在实际代码中,我们先计算出左规则left数组,在计算右规则的时候只需要用单个变量记录当前位置的右规则,同时计算答案即可。
class Solution {public int candy(int[] ratings) {// 1、定义left[]数组,计算每个小朋友符合左侧规则时,能获取到的糖果// 2、定义两个变量,第一个计算前一个小朋友的糖果,第二个计算总的糖果数量,从右侧开始计算if (ratings.length == 0) {return 0;}// 创建数组int[] left = new int[ratings.length];left[0] = 1;for(int i = 1; i < ratings.length; i++) {if (ratings[i] > ratings[i - 1]) {left[i] = left[i - 1] + 1;} else {left[i] = 1;}}// 先初始化最后一个小朋友的糖果int next = 1, count = Math.max(1, left[ratings.length - 1]);for(int i = ratings.length - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {next += 1;} else {next = 1;}count += Math.max(next, left[i]);}return count;}
}
时间复杂度: O(2n)其中n是孩子的数量。我们需要遍历两次数组以分别计算满足左规则或右规则的最少糖果数量。
空间复杂度: O(n)其中n是孩子的数量。我们需要保存所有的左规则对应的糖果数量。
【2】常数空间遍历: 定义两个变量,第一个计算当前小朋友的糖果pre,第一个小朋友默认为1,第二个计算总的糖果数量count,如果时递增的,那么就比较简单,我们给pre+1,如果递减了,我们重置pre = 1即可。下面考虑两个特殊场景:
● 当pre=1时,开始递减时,我们需要再创建一个变量decr,来表示递减的次数,然后将其累积到count中,也就达到了将递减转化为递增的效果。
● 当递减的队列长度,超过了递减前小朋友的糖果时,我们需要对递减前的小朋友的糖果+n,例如下图: 从左侧遍历时,第三个小朋友应该是3个糖果,所以定义inc记录递减前小朋友的糖果,如果递减的糖果decr等于递减前的糖果inc,就需要对inc + 1;

class Solution {public int candy(int[] ratings) {// 1、定义两个变量,第一个计算当前小朋友的糖果pre,第二个计算总的糖果数量count。// 2、左侧遍历时,如果时递减的情况,需要再创建一个变量,计算递减的次数 decr。// 3、特殊处理:递减的时候,如果我拥有的糖果和递减前小朋友的糖果个数相同时,需要++,举例:5321的时候,5有3个糖果,此时的3再递减中也会有5个糖果,所以就需要对5的糖果+1if (ratings.length == 0) {return 0;}// 先初始化最后一个小朋友的糖果int pre = 1, count = 1, decr = 0, inc = 1;for(int i = 1; i < ratings.length; i++) {if (ratings[i] >= ratings[i - 1]) {pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;;// 如果时递增的,当前递减序列结束decr = 0;count += pre;// pre表示当前小朋友用于的当过inc = pre;} else {// 如果开始了递减序列,我们就开始记录递减序列的长度decr++;// 递减的时候,如果我拥有的糖果和递减的小朋友的个数相同时,需要++,举例:5321的时候,5有3个糖果,此时的3再递减中也会有5个糖果,所以就需要对5+1if (inc == decr) {decr++;}// 重置糖果为1pre = 1;count += decr;}}return count;}
}
时间复杂度: O(n)其中n是孩子的数量。我们需要遍历两次数组以分别计算满足左规则或右规则的最少糖果数量。
空间复杂度: O(1)我们只需要常数的空间保存若干变量。
相关文章:
分发糖果[困难]
优质博文:IT-BLOG-CN 一、题目 n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果: 【1】每个孩子至少分配到1个糖果。 【2】相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩…...
Java验证邮箱格式是否正确的正则表达式
Java验证邮箱格式是否正确的正则表达式 import java.util.regex.Pattern;public class EmailUtil {final static Pattern partern Pattern.compile("[a-zA-Z0-9][\\.]{0,1}[a-zA-Z0-9][a-zA-Z0-9]\\.[a-zA-Z]");/*** 验证输入的邮箱格式是否符合* param email* ret…...
快速排序原理JAVA和Scala实现-函数式编程的简洁演示
快速排序原理JAVA和Scala实现-函数式编程的简洁演示 目录 快速排序原理JAVA和Scala实现-函数式编程的简洁演示 C语言快速排序实现 Java 快速排序实现 Scala 快速排序实现 本文章向大家介绍快速排序原理JAVA和Scala实现-函数式编程的简洁演示,主要内容包括C语言…...
如何在linux服务器上安装Anaconda与pytorch
如何在linux服务器上安装Anaconda与pytorch 1,安装anaconda1.1 下载anaconda安装包1.2 安装anaconda1.3 设计环境变量1.4 安装完成验证 2 Anaconda安装pytorch2.1 创建虚拟环境2.2 查看现存环境2.3 激活环境2.4 选择合适的pytorch版本下载2.5 检测是否安装成功&…...
FPGA设计FIR滤波器低通滤波器,代码及视频
名称:FIR滤波器低通滤波器 软件:Quartus 语言:Verilog/VHDL 本资源含有verilog及VHDL两种语言设计的工程,每个工程均可实现以下FIR滤波器的功能。 代码功能: 设计一个8阶FIR滤波器(低通滤波器ÿ…...
【数据结构】排序--快速排序
目录 一 概念 二 快速排序的实现 1. hoare版本 (1)代码实现 (2)单趟排序图解 (3) 递归实现图解 (4)细节控制 (5)时间复杂度 (6)三数取中优化 2 挖坑法 (1)代码实现 (2)单趟图解 3 前后指针法 (1) 代码实现 (2) 单趟图解 4 优化子区间 5 非递归快速排序 …...
【试题040】多个逻辑或例题2
1.题目:设int n0;,执行表达式n ||(n-1) ||(n0)||(n1)||(n2)后n的值是 ? 2.代码解析: 逻辑或 || 运算符是一个短路运算符,它从左到右依次计算表达式,如果遇到一个为真(非零)的值&am…...
自然语言处理---Self Attention自注意力机制
Self-attention介绍 Self-attention是一种特殊的attention,是应用在transformer中最重要的结构之一。attention机制,它能够帮助找到子序列和全局的attention的关系,也就是找到权重值wi。Self-attention相对于attention的变化,其实…...
推荐收藏系列!2万字图解Hadoop
今天我用图解的方式讲解pandas的用法,内容较长建议收藏,梳理不易,点赞支持。 学习 Python 编程,给我的经验就是:技术要学会分享、交流,不建议闭门造车。一个人可能走的很快、但一堆人可以走的更远。如果你…...
Python高级篇(08):生成器
一、生成器定义和作用 定义:Python中,一边循环一边计算的机制,生成器对象也是迭代器对象,支持for循环、next()方法…等。作用:循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而…...
力扣100114. 元素和最小的山形三元组 II(中等)
题目描述: 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件,则认为它是一个 山形三元组 : i < j < knums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的山形三元组…...
LuatOS-SOC接口文档(air780E)--lcdseg - 段式lcd
常量 常量 类型 解释 lcdseg.BIAS_STATIC number 没偏置电压(bias) lcdseg.BIAS_ONEHALF number 1/2偏置电压(bias) lcdseg.BIAS_ONETHIRD number 1/3偏置电压(bias) lcdseg.BIAS_ONEFOURTH number 1/4偏置电压(bias) lcdseg.DUTY_STATIC number 100%占空比(d…...
实现图像处理和分析的关键技术
在计算机视觉中,我们可以利用摄像头捕捉到的图像来进行各种分析和处理。以下是一些常见的计算机视觉任务: 对象检测:识别图像中的特定对象并标注其位置。人脸识别:识别和验证人脸身份。姿态估计:估计人体的姿态和动作…...
【C++学习笔记】内联函数
1. 概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数…...
macOS Sonoma 14.1RC(23B73)发布
黑果魏叔10 月 18 日消息,苹果今日向 Mac 电脑用户推送了 macOS 14.1 RC更新(内部版本号:23B73),本次更新距离上次发布隔了 7 天。 macOS Sonoma 14.1RC(23B73)的更新内容主要包括以下方面&…...
数据结构数组 Array 手写实现,扩容原理
数组数据结构 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型数据的集合。 数组的特点: 数组是相同数据类型的元素集合(int 不能存放 double)数组中各元素的存储是有先…...
工作中几个问题的思考
对于需要并行多公司并行处理的任务,方案是什么? 多线程、并行流、并发库(ExecutorService、Futrue、Callable),分布式计算(1)按照公司ID分片 (2)按照业务类型分片 处理…...
Jmeter的性能测试
性能测试的概念 定义:软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。 由定义可知性能关注的是软件的非功能特性,所以一般来说性能测试介入的时机是在功能测试…...
IntelliJ IDEA 2020.2.1白票安装使用方法
先安装好idear Plugins 内手动添加第三方插件仓库地址:https://plugins.zhile.io 搜索:IDE Eval Reset插件进行安装 输入https://plugins.zhile.io 手动安装离线插件方法 安装包可以去笔者的CSDN资源库下载 安装mybaties插件...
【UCAS自然语言处理作业一】利用BeautifulSoup爬取中英文数据,计算熵,验证齐夫定律
文章目录 前言中文数据爬取爬取界面爬取代码 数据清洗数据分析实验结果 英文数据爬取爬取界面动态爬取 数据清洗数据分析实验结果 结论 前言 本文分别针对中文,英文语料进行爬虫,并在两种语言上计算其对应的熵,验证齐夫定律github: ShiyuNee…...
【2024生成式推荐算法权威基准报告】:12家主流平台Llama-3/Gemini/DeepSeek适配实测数据,仅开放72小时下载权限
第一章:生成式AI应用推荐算法优化 2026奇点智能技术大会(https://ml-summit.org) 生成式AI正深度重构推荐系统的核心范式——从传统协同过滤与矩阵分解,转向以大语言模型(LLM)和扩散模型为基座的语义理解、意图生成与多模态内容合…...
Flux Sea Studio 性能基准测试:不同GPU型号下的生成速度对比
Flux Sea Studio 性能基准测试:不同GPU型号下的生成速度对比 最近在折腾AI生图,特别是用Flux Sea Studio,发现一个挺实际的问题:选什么GPU?是咬牙上顶配的RTX 4090,还是性价比更高的RTX 3080?它…...
从零构建数据可视化大屏:SpringBoot后端与ECharts前端的交互实践
1. 环境准备与项目初始化 第一次接触数据可视化大屏开发时,我被各种技术名词绕得头晕。后来发现,其实只要把SpringBoot和ECharts这两个核心工具准备好,后面的路就顺畅多了。这里我分享下最省心的环境搭建方案。 开发工具我强烈推荐IntelliJ I…...
保姆级教程:用MATLAB实现锂电池模型参数在线辨识(附NEDC工况数据)
从零实现锂电池参数在线辨识:MATLAB实战指南与NEDC工况解析 锂电池参数辨识是电池管理系统(BMS)开发中的核心技术难点。许多工程师在阅读相关论文时,常会遇到算法原理清晰但代码实现困难的窘境。本文将提供一个完整的MATLAB实现方…...
Dev-C++ 6.3与5.11版本对比:如何根据你的Windows系统选择最佳IDE版本
Dev-C 6.3与5.11版本深度对比:如何为你的Windows系统选择最佳开发环境 当你在Windows系统上寻找一款轻量级C/C集成开发环境时,Dev-C总是会出现在推荐列表中。但面对Embarcadero Dev-C 6.3和经典的Dev-Cpp 5.11两个主要版本,很多开发者都会陷入…...
应对2026检测新规:论文如何优化?实测10款降低AI率工具,SCI/工科适用
现在写论文最怕的,已经不是查重了。怕什么?怕那个AIGC率太高。 真的,越来越多学校开始抓AIGC检测报告了,重复率放一边,就看你AI痕迹多不多。我自己就是刚爬出坑的25届学姐,这坑我踩得死死的。怎么说呢&…...
火速报名 | 2026中国高校计算机大赛——大数据挑战赛,五星级巅峰对决,邀您问鼎!
在数据洪流奔涌、AI重塑未来的2026年,一场属于全球数据英才的顶级学术竞赛已拉开帷幕。2026中国高校计算机大赛——大数据挑战赛现已全面启动,诚邀您投身这场思维与算法的巅峰较量,在金融时序预测的浪潮中,展现您的智慧锋芒&#…...
远程办公场景Allegro许可证安全使用方案
远程办公场景下的Allegro许可证安全使用方案 讲真,这帮年我在几家制造企业当过顾问,见过太多人就因为软件许可出了大事。有的项目卡在软件申麻烦上,急得直跺脚;有的IT部门天天在干“抢许可”的活儿,忙得焦头烂额。最离…...
保姆级教程:用Charades数据集复现行为识别模型(附PyTorch代码与避坑指南)
从零构建Charades行为识别模型:PyTorch实战与调优全攻略 在计算机视觉领域,行为识别一直是极具挑战性的研究方向。不同于静态图像分类,视频行为识别需要模型理解时间维度的信息变化,这对算法设计和工程实现都提出了更高要求。Char…...
从“0x7C显示b”说开去:图解单片机GPIO驱动数码管的底层电路与电平逻辑
从“0x7C显示b”说开去:图解单片机GPIO驱动数码管的底层电路与电平逻辑 数码管作为嵌入式系统中最基础的人机交互元件之一,其驱动原理看似简单却蕴含着硬件与软件协同工作的精妙设计。许多初学者能够熟练编写P00x7C这样的代码让数码管显示字母"b&qu…...
