如何使用多种算法解决LeetCode第135题——分发糖果问题

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

题目描述

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:

  1. 每个孩子至少分到一个糖果。
  2. 评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。

你需要最少准备多少糖果。

示例 1:

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

示例 2:

输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题目要求。

方法一:两次遍历法

解题步骤

  1. 创建一个糖果数组,初始化每个孩子的糖果数为 1。
  2. 从左到右遍历,如果当前孩子的评分高于前一个孩子,则当前孩子的糖果数设置为前一个孩子的糖果数加一。
  3. 从右到左遍历,如果当前孩子的评分高于后一个孩子,并且当前孩子的糖果数不大于后一个孩子的糖果数,则当前孩子的糖果数设置为后一个孩子的糖果数加一。
  4. 返回糖果数组的总和。

Python 示例

def candy(ratings):n = len(ratings)candies = [1] * n# 从左到右遍历for i in range(1, n):if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1# 从右到左遍历for i in range(n - 2, -1, -1):if ratings[i] > ratings[i + 1] and candies[i] <= candies[i + 1]:candies[i] = candies[i + 1] + 1return sum(candies)# Example usage
ratings = [1, 0, 2]
print(candy(ratings))  # Output: 5ratings = [1, 2, 2]
print(candy(ratings))  # Output: 4

算法分析

  • 时间复杂度:O(N),其中 N 是孩子的数量。需要遍历两次数组。
  • 空间复杂度:O(N),用于存储糖果数量的数组。

算法图解与说明

考虑 ratings = [1, 0, 2]初始化糖果数组:candies = [1, 1, 1]左到右遍历:
索引1: 1 (评分 0) <= 0 (评分 1), 无变化
索引2: 2 (评分 2) > 0 (评分 0), 更新 candies[2] = candies[1] + 1 = 2
结果: candies = [1, 1, 2]右到左遍历:
索引1: 0 (评分 1) > 0 (评分 1) 且 candies[1] <= candies[2], 无变化
索引0: 1 (评分 1) > 0 (评分 0), 更新 candies[0] = candies[1] + 1 = 2
结果: candies = [2, 1, 2]总糖果数: 2 + 1 + 2 = 5

方法二:单次遍历法

解题步骤

  1. 创建一个糖果数组,初始化每个孩子的糖果数为 1。
  2. 使用一个标记数组来记录相邻孩子之间的关系(评分高的标记为 1,评分低的标记为 -1,相等标记为 0)。
  3. 单次遍历,根据标记调整糖果数,确保所有条件都满足。
  4. 返回糖果数组的总和。

Python 示例

def candy(ratings):n = len(ratings)if n == 0:return 0if n == 1:return 1candies = [1] * nfor i in range(1, n):if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1for i in range(n - 2, -1, -1):if ratings[i] > ratings[i + 1]:candies[i] = max(candies[i], candies[i + 1] + 1)return sum(candies)# Example usage
ratings = [1, 0, 2]
print(candy(ratings))  # Output: 5ratings = [1, 2, 2]
print(candy(ratings))  # Output: 4

算法分析

  • 时间复杂度:O(N),其中 N 是孩子的数量。需要遍历两次数组。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

算法图解与说明

考虑 ratings = [1, 0, 2]初始化糖果数组:candies = [1, 1, 1]单次遍历:
从左到右遍历:
索引1: 1 (评分 0) <= 0 (评分 1), 无变化
索引2: 2 (评分 2) > 0 (评分 0), 更新 candies[2] = candies[1] + 1 = 2
结果: candies = [1, 1, 2]从右到左遍历:
索引1: 0 (评分 1) > 0 (评分 1) 且 candies[1] <= candies[2], 无变化
索引0: 1 (评分 1) > 0 (评分 0), 更新 candies[0] = candies[1] + 1 = 2
结果: candies = [2, 1, 2]总糖果数: 2 + 1 + 2 = 5

这两种方法都能有效地解决分发糖果的问题,确保每个孩子至少得到一颗糖果,并且评分更高的孩子比相邻孩子获得更多糖果。选择哪种方法可以根据具体场景和个人喜好而定。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

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

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

相关文章

WPF 的 style 定义 使用 继承 复用

style 样式 如何定义一个 style 样式 <Button Content"样式" Width"100" Height"50"><Button.Style><Style></Style></Button.Style></Button>拥有的属性 targetType “” 针对什么类型生效setter 设置属…

Ubuntu中 petalinux 安装 移植linux --tftp/tftp-hpa服务的方法

Xilinx 文档 PetaLinux 指南&#xff1a;如何创建 PetaLinux 环境 &#xff08;2019.1&#xff09; PetaLinux工具参考指南 PetaLinux安装详解(Xilinx , linux, zynq, zynqMP) petalinux 2020.1安装教程 一、PetaLinux工具和库安装 PetaLinux 工具要求主机系统 /bin/sh 为“b…

18.网络编程

网络编程 又称为Socket编程。 Java中网络编程主要是以Java语言完成信息数据在网络上的传输。 网络 计算机网络&#xff0c;指的是将不同地理位置的多台计算机连接起来&#xff0c;可以实现信息共享和信息传输。 Java是Internet上的语言&#xff0c;提供了对网络应用程序的…

笔记 | 《css权威指南》

网络安全色 URL text-indent line-height & vertical-align 字体 font-weight 400 normal 700 bold background-attachment

SpringBoot项目集成JetCache缓存框架步骤

JetCache是阿里开源的基于java开发的缓存框架&#xff0c;支持多种缓存类型&#xff1a;本地缓存、分布式缓存、多级缓存。能够满足不同业务场景的缓存需求。 1.导入依赖 <!--jetcache缓存 --> <dependency><groupId>com.alicp.jetcache</groupId>&l…

【调试笔记-20240516-Windows-使用VS2019编译edk2(上)】

调试笔记-系列文章目录 调试笔记-20240516-Windows-使用VS2019编译edk2&#xff08;上&#xff09; 文章目录 调试笔记-系列文章目录调试笔记-20240516-Windows-使用VS2019编译edk2&#xff08;上&#xff09; 前言一、安装开发工具1. 安装 VS20192. 安装 Python 3.103. 安装 …

pdf加水印怎么加?3种添加水印方法分享

pdf加水印怎么加&#xff1f;PDF加水印不仅是为了保护文档内容&#xff0c;确保信息的安全性和完整性&#xff0c;更是一种有效的版权保护措施。通过添加水印&#xff0c;您可以在文档中嵌入公司名称、日期、编号等信息&#xff0c;以明确文档的归属权和使用限制。此外&#xf…

小而美:两步完成从源码到应用的极简交付

作者&#xff1a;花三&#xff08;王俊&#xff09; Serverless 应用引擎 SAE 是阿里云推出的一款零代码改造、极简易用、自适应弹性的容器化应用托管平台&#xff0c;面市以来为几万家企业客户提供服务&#xff0c;运行稳定&#xff0c;广受好评。 SAE 的出现解决了众多企业…

Python库之lxml的简介、安装、使用方法详细攻略

Python库之lxml的简介、安装、使用方法详细攻略 简介 lxml是一个用于处理XML和HTML文档的Python库&#xff0c;它提供了简单易用的API来解析和生成这些文档。lxml以其性能和易用性而受到广泛欢迎&#xff0c;特别适合于需要处理大量数据或需要高性能解析的场景。 安装 安装…

运行时异常和编译时异常的区别

Java中的异常被分为两大类&#xff1a;编译时异常和运行时异常。 都是RuntimeException类及其子类异常&#xff0c;如NullPointerException、IndexOutOfBoundsException。这些异常是不检查异常&#xff0c;运行时异常的特点是Java编译器不会检查它&#xff0c;程序中可以选择捕…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的&#xff0c;不过有些WordPress网站评论内容比较多&#xff0c;而且也比较有用&#xff0c;所以想要让用户在搜索时也能够同时搜索到评论内容&#xff0c;那么应该怎么做呢&#xff1f; 网络上很多教程都是推荐安装SearchWP插…

RK3588 Android13 预安装自己的apk应用及把这个应用设置为默认桌面

1、cp -rf device/rockchip/rk3588/rk3588m_s/preinstall device/rockchip/rk3588/rk3588_t/ 2、给device/rockchip/rk3588/rk3588_t/preinstall/的存放app的文件夹改名为app-imms2&#xff0c;在app-imms2放入app-imms2.apk,编译安卓源码即可&#xff0c; 3、编译完会在out/…

android sp指针的cast

sp<Base> b; sp<Derived> d; b static_cast<Base*>(d.get()); 对于c原生的智能指针&#xff0c;有static_pointer_cast之类的操作方法。可以看cppreference。

Spring Web MVC介绍及详细教程

目录 1.什么是Spring Web MVC&#xff1f; 1.1 MVC定义 1.2 Spring MVC与MVC关系 2.为什么要学习Spring MVC 3.项目创建 4.Spring MVC连接 4.1 RequestMapping 4.2 PostMapping和GetMapping 5.Spring MVC参数获取 5.1 获取单个参数 5.2 获取多个参数 5.3 获取普通对…

通用代码生成器应用场景一,项目前期

通用代码生成器是一种自动化编程软件&#xff0c;是一种先进的编译系统。它具有表级抽象。把系统抽象为域对象&#xff0c;枚举&#xff0c;弹性登录模块&#xff0c;复杂版面和图形报表。使用通用代码生成器完成项目前期&#xff0c;比直接使用对应的高级语言快的多&#xff0…

element Notification 消息过多需要折叠

Notification 消息过多太长 希望能折叠 如图下效果 element-plus 可以将dom 插入到具体的元素 结合css :nth-child 来控制样式达到效果 element dom 只能插入到body中 所以无法使用:nth-child 1.Notification需要消息提示时设置class let eleNum 0 // 弹窗的序号 function…

vue+canvas实现逐字手写效果

在pc端进行逐字手写的功能。用户可以在一个 inputCanvas 上书写单个字&#xff0c;然后在特定时间后将这个字添加到 outputCanvas 上&#xff0c;形成一个逐字的手写效果。用户还可以保存整幅图像或者撤销上一个添加的字。 <template><div class"container"…

小红书-社区搜索部 (NLP、CV算法实习生) 一面面经

&#x1f604; 整个流程按如下问题展开&#xff0c;用时60min左右面试官人挺好&#xff0c;前半部分问问题&#xff0c;后半部分coding一道题。 各位有什么问题可以直接评论区留言&#xff0c;24小时内必回信息&#xff0c;放心~ 文章目录 1、自我介绍2、介绍下项目&#xff…

金额计算导致的错误问题汇总解决

在日常的开发中&#xff0c;前端计算金额是非常常见&#xff0c;如果不够仔细&#xff0c;考虑不够周全的话&#xff0c;很容易犯错的&#xff0c;金额这个东西一但错了是很严重的&#xff0c;因此总结一些常见的错误&#xff1a; 1.最重要的&#xff0c;涉及到计算的参数一定要…

关于做事方式的小讨论

大家好&#xff0c;我是阿赵。   之前五一劳动节期间&#xff0c;看到了这么一个新闻&#xff1a;某动物园内部收费项目五一期间涨价&#xff0c;喂长颈鹿的树叶&#xff0c;一枝需要30元。然后新闻下面的评论就炸锅了&#xff0c;纷纷的指责动物园太黑心&#xff0c;一枝树叶…