LeetCode-Java:135.分发糖果

文章目录

    • 题目
      • ① 穷举法,用时3ms,超过26.93%
      • ②穷举法改进,用时2ms,超过97.78%

题目

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

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

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

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

示例 1:

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

示例 2:

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

① 穷举法,用时3ms,超过26.93%

数组正序,当前元素和前后的元素比较,如果大则要保证比相邻的同学糖果多1个,数组逆序检查,如果当前同学的评分比相邻同学高,则保证比相邻同学糖果多1个。

注:下面的代码为了简化,设置了每个同学初始获得的糖果为0,计算完成之后再给每个同学发一个糖果,保证每人至少1个,所以candy数组并不是实际发放的糖果数目,还要在计算之后每个元素+1

问题:为什么正序之后,还要逆序检查?

答:假设没有逆序检查,用例ratings输入为[1,2,87,87,87,2,1]时,candy=[0,1,2,0,1,1,0]。当for循环运行到最后一个‘87’时,candy=[0,1,2,0,0,0,0],下一个评分为‘2’的同学,此时分配的糖果数目为0,所以最后一个‘87’分的同学满足比相邻同学的糖果多1个,分配糖果数目为1,即candy=[0,1,2,0,1,0,0]。然后运行至分数为‘2’的同学那里,按照和相邻同学对比的原则,最终可得1个糖果,因为他的糖果数目发生改变,所以之前分配给‘87’分同学的数目就少了一个,不满足原题目条件,故最后需要逆序检查。

问题:既然要检查,为什么不改成如果当前元素的糖果发生变化,就对上一个进行检查呢?

答:这个思路尝试后发现,如果当前同学的糖果增加了,上一个同学的糖果可能也会变化,上一个同学的糖果如果变化,那么上上个同学也应该检查。如此循环反复,就会变成每一次发生变化之后,就得检查前面所有的同学是否要改变,比逆序检查一次所耗费的时间更多。举个例子,ratings=[1,16,10,8,7,3,2],如果按照只检查上一次的话,最终的candy=[0,1,2,2,2,1,0],不符合题目要求。

class Solution {public int candy(int[] ratings) {int[] candy=new int[ratings.length];//数组初始所有元素为0int num=0;//数组正序,检查每个同学和相邻同学评分for(int i=0;i<ratings.length;i++){if(i!=ratings.length-1 && ratings[i]>ratings[i+1]){// 如果该同学比下一个同学分数高,则他的糖果要比下一个同学多1个candy[i]=candy[i+1]+1;}if(i!=0 && ratings[i]>ratings[i-1]){// 如果该同学比上一个同学分数高,则他的糖果要比下一个同学多1个candy[i]=candy[i-1]+1;}}//数组逆序,检查分配是否有误for(int i=ratings.length-1;i>=0;i--){if(i!=0 && ratings[i]>ratings[i-1] && candy[i]<=candy[i-1]){// 如果该同学比上一个同学分数高,并且糖果少于上一个同学,则他要比上个同学多一个candy[i]=candy[i-1]+1;}if(i!=ratings.length-1 && ratings[i]>ratings[i+1] && candy[i]<=candy[i+1]){// 如果该同学比下一个同学分数高,并且糖果少于下一个同学,则他要比下个同学多一个candy[i]=candy[i+1]+1;}}for(int j=0;j<ratings.length;j++){// 将数组的所有元素相加num+=candy[j];}return num+ratings.length;//每个同学至少一个糖果,所以返回值加上length}
}

②穷举法改进,用时2ms,超过97.78%

和①的区别在于,①每次循环都是和前后两个元素进行比较,②正循环的时候只和左边元素比较,倒序的时候只和右边元素比较

删掉了两个if的部分,对代码进行了简化

class Solution {public int candy(int[] ratings) {int[] candy=new int[ratings.length];int num=0;for(int i=0;i<ratings.length;i++){if(i!=0 && ratings[i]>ratings[i-1]){candy[i]=candy[i-1]+1;}}for(int i=ratings.length-1;i>=0;i--){if(i!=ratings.length-1 && ratings[i]>ratings[i+1] && candy[i]<=candy[i+1]){candy[i]=candy[i+1]+1;}}for(int j=0;j<ratings.length;j++){num+=candy[j];}return num+ratings.length;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像拼接——最小割准则提取拼接缝

一、最大流问题与Ford-Fulkerson算法介绍 二、最大流与最小割 显然,我们有对任意一个割,穿过该割的净流量上界就是该割的容量,即不可能超过割的容量。所以网络的最大流必然无法超过网络的最小割。最小割是指割的容量最小,最大流是指网络当中最大的净流量,简单的例子s是水龙…

速盾:cdn高防御服务器租用有哪些好处

随着互联网的发展&#xff0c;网络安全问题日益突出。攻击者利用各种手段不断对网站进行攻击&#xff0c;给网站的安全运行带来威胁。为了保障网站的正常运行和数据的安全&#xff0c;越来越多的网站开始租用CDN高防御服务器。那么&#xff0c;租用CDN高防御服务器有哪些好处呢…

【蓝桥备赛】异或和——树状数组、DFS

题目链接 异或和 思路分析 树上每个点都有一个点权&#xff0c;对树上的更新操作是修改指定点的点权&#xff0c;查询操作是查询指定点为根结点的子树点权异或和。 这里的这些操作都和树状数组的单点修改和区间查询非常相似&#xff0c;即我们在修改一个点时&#xff0c;同时…

蓝桥杯真题:递增序列

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main {public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横…

SAP新的扩展策略

在软件即服务&#xff08;SaaS&#xff09;应用的推动下&#xff0c;SAP Cloud优先的战略非常明显&#xff0c;随之带来的是SAP Clean core的战略&#xff0c;从经典的 ABAP 可扩展性模式转变为 SAP S/4HANA 现代可扩展性模式。那么Clean core战略到底是什么&#xff1f;新的扩…

基于向量数据库搭建自己的搜索引擎

前言【基于chatbot】 厌倦了商业搜索引擎搜索引擎没完没了的广告&#xff0c;很多时候&#xff0c;只是需要精准高效地检索信息&#xff0c;而不是和商业广告“斗智斗勇”。以前主要是借助爬虫工具&#xff0c;而随着技术的进步&#xff0c;现在有了更多更方便的解决方案&…

LongAdder 和 Striped64 基础学习

cs&#xff0c;表示 Cell 数组的引用&#xff1b;b&#xff0c;表示获取的 base 值&#xff0c;类似于 AtomicLong 中全局变量的 value 值&#xff0c;在没有竞争的情况下数据直接累加到 base 上&#xff0c;或者扩容时&#xff0c;也需要将数据写入到 base 上&#xff1b;v&am…

Linux第2课Windows下的环境配置-虚拟机安装

文章目录 Linux第2课Windows下的环境配置-虚拟机安装一、VMware虚拟机的安装&#xff08;一&#xff09;安装VMware&#xff08;二&#xff09;启动电脑本地的VMware相关服务 二、VirtualBox安装 Linux第2课Windows下的环境配置-虚拟机安装 本节课程提供了两种虚拟机的安装方法…

个人医疗开支预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 随着医疗成本的持续上涨&#xff0c;个人医疗开支成为一个重要议题。理解影响医疗费用的多种因素对于医疗保险公司、政府机构以及个人…

磁环的使用方法

磁环的使用方法 磁环的工作原理共模滤波用法差模滤波用法各种材料磁环的对应频率磁环的感量计算 磁环的工作原理 共模滤波用法 差模滤波用法 各种材料磁环的对应频率 磁环的感量计算

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

软考之零碎片段记录(五)

一、设计模式 1.策略模式 可在运行时改变行为和算法。这种类型的设计模式属于行为模式。使得代码更加灵活和可维护。 2. 命令模式 将请求封装成独立的对象并通过参数传递。属于行为模式。 3. 观察者模式 当对象状态改变时&#xff0c;依赖于它的对象都会被通知并进行更新…

Java操作hdfs,总是报ClosedChannelException

现象 public boolean uploadFile(MultipartFile file, String dst) {try {long start System.currentTimeMillis();// 创建Hadoop配置对象Configuration config new Configuration();config.set("fs.defaultFS", hdfsUri);Path dstPath new Path(ROOT_PATH dst)…

【MATLAB源码-第177期】基于matlab的蜘蛛蜂优化算法(SWO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜘蛛蜂优化算法&#xff08;Spider Wasp Optimization, SWO&#xff09;是一种启发式算法&#xff0c;它受到自然界中蜘蛛和蜂这两种生物的行为模式启发而开发。这一算法主要模拟了蜘蛛捕食与蜂群社会行为之间的相互作用&…

Mac brew 安装软件

Mac brew 安装软件 homebrew 速度慢 将brew 切换到国内镜像源 # 速度一般 # 步骤一 cd "$(brew --repo)" git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git# 步骤二 cd "$(brew --repo)/Library/Taps/homebrew/homebr…

网络以太网之(1)基础概念

网络以太网之(1)基础概念 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

C语言-----数据在内存中的存储(1)

1.整数在内存中的存储 我们之前就了解过整数的二进制写法分别有3种&#xff0c;分别为原码&#xff0c;反码&#xff0c;补码。整型在内存中存储的是补码。 原码&#xff0c;反码&#xff0c;补码都有自己的符号位和数值位&#xff0c;符号位为1时&#xff0c;则表示负数&…

os模块篇(十四)

文章目录 os.renames(old, new)os.replace(src, dst, *, src_dir_fdNone, dst_dir_fdNone)os.rmdir(path, *, dir_fdNone)os.scandir(path.)os.stat(path, *, dir_fdNone, follow_symlinksTrue)os.statvfs(path) os.renames(old, new) os.renames(old, new) 是 Python 的 os 模…

一些常见的Prometheus+Grafana问题和答案:

什么是Prometheus&#xff1f;它的主要功能是什么&#xff1f; Prometheus是一个开源的系统监控和报警工具。它通过收集和存储时间序列数据&#xff0c;提供了强大的查询语言和灵活的报警规则&#xff0c;可以帮助监控和分析系统的性能指标。 Prometheus的数据模型是什么样的…

LLM记录1

LLM的知识库问答有3种实现路径&#xff1a;RAG 或 微调&#xff0c;或两者结合。 RAG&#xff1a;低成本易部署&#xff0c;适用于知识会更新的场景&#xff0c;但知识内容多的情况下&#xff0c;检索成本会变高。微调&#xff1a;算力成本高&#xff0c;微调效果不稳定&#x…