Leetcode 分发糖果

在这里插入图片描述

这段代码的算法思想是 贪心算法,通过两次遍历,分别从左到右、从右到左调整糖果分配,以满足题目中相邻评分较高的孩子必须获得更多糖果的要求,并最终计算出最少需要分配的糖果总数。

以下是代码的详细思想与执行过程:


算法思想

  1. 每个孩子至少分配一个糖果

    • 每个孩子至少应该有一个糖果,初始化糖果数组 candies,所有孩子的糖果数都为 1。
  2. 从左到右遍历

    • 如果当前孩子的评分 高于左边的孩子,那么当前孩子的糖果数应该比左边的孩子多 1。
    • 这样可以确保当前孩子的糖果分配满足 “相邻评分更高的孩子分得更多糖果” 的规则。
  3. 从右到左遍历

    • 如果当前孩子的评分 高于右边的孩子,那么当前孩子的糖果数也应该比右边的孩子多 1。
    • 但这里需要特别注意:因为已经有一个从左到右的遍历调整结果,所以需要取当前糖果数和从右到左计算结果的最大值,保证不破坏之前的分配规则。
  4. 累加糖果总数

    • 最后,将 candies 数组中的糖果数累加,得到分配糖果的最小总数。

代码逻辑解析

1. 初始化糖果数组:
int[] candies = new int[n];
for (int i = 0; i < n; i++) {
    candies[i] = 1;
}

每个孩子最少分一个糖果,因此初始化 candies 数组为全 1。

2. 从左到右遍历:
for (int i = 1; i < n; i++) {
    if (ratings[i] > ratings[i - 1]) {
        candies[i] = candies[i - 1] + 1;
    }
}
  • 当发现当前孩子评分比左边孩子高时,将当前孩子的糖果数设置为左边孩子的糖果数加 1。
  • 这一步确保了左->右方向相邻评分规则满足。
3. 从右到左遍历:
for (int i = n - 2; i >= 0; i--) {
    if (ratings[i] > ratings[i + 1]) {
        candies[i] = Math.max(candies[i], candies[i + 1] + 1);
    }
}
  • 当发现当前孩子评分比右边孩子高时,将当前孩子的糖果数设置为右边孩子的糖果数加 1。
  • 同时,用 Math.max 确保糖果分配满足左右两次遍历的规则。
4. 计算糖果总数:
int totalCandies = 0;
for (int candy : candies) {
    totalCandies += candy;
}

candies 数组中所有的糖果数加起来,得到最终需要的最少糖果总数。


关键点

  1. 双向遍历

    • 从左到右遍历保证了当前孩子比左边评分高时的糖果分配;
    • 从右到左遍历保证了当前孩子比右边评分高时的糖果分配;
    • 两次遍历结合,确保所有规则都满足。
  2. 动态调整

    • 在从右到左遍历时,利用 Math.max 动态调整糖果分配,避免破坏从左到右遍历的结果。
  3. 贪心策略

    • 每次只关心局部相邻的两个孩子是否满足规则,通过两次遍历全局保证规则满足。

复杂度分析

  1. 时间复杂度
    • 两次线性遍历,时间复杂度为 (O(n))。
  2. 空间复杂度
    • 使用了额外的 candies 数组,空间复杂度为 (O(n))。

总结

这段代码巧妙地利用贪心算法,分两次遍历调整糖果分配,既满足了规则,也保证了糖果分配数量的最小化,是一道经典的动态调整问题。

class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        int[] candies = new int[n];

        for(int i = 0; i < n; i++) {
            candies[i] = 1;
        }
        for(int i = 1; i < n; i++) {
            if(ratings[i] > ratings[i - 1]) {
                candies[i] = candies[i - 1] + 1;
            }
        }
        for(int i = n - 2; i >= 0; i--) {
            if(ratings[i] > ratings[i + 1]) {
                candies[i] = Math.max(candies[i], candies[i + 1] + 1);
            }
        }

        int result = 0;
        for(int i = 0; i < n; i++) {
            result += candies[i];
        }
        return result;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

39页PDF | 毕马威_数据资产运营白皮书(限免下载)

一、前言 《毕马威数据资产运营白皮书》探讨了数据作为新型生产要素在企业数智化转型中的重要性&#xff0c;提出了数据资产运营的“三要素”&#xff08;组织与意识、流程与规范、平台与工具&#xff09;和“四重奏”&#xff08;数据资产盘点、评估、治理、共享&#xff09;…

【Redis_Day5】String类型

【Redis_Day5】String类型 String操作String的命令set和get&#xff1a;设置、获取键值对mset和mget&#xff1a;批量设置、获取键值对setnx/setex/psetexincr和incrby&#xff1a;对字符串进行加操作decr/decrby&#xff1a;对字符串进行减操作incrbyfloat&#xff1a;浮点数加…

linux安装mysql57——笔记

rpm -qa | grep mysql有东西就rpm -e 文件名 下载 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm安装 yum -y install mysql57-community-release-el7-10.noarch.rpm安装 yum -y install mysql-community-server如果出现Error: GPG c…

基于Java Springboot高校会议室预订管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

基于 NCD 与优化函数结合的非线性优化 PID 控制

基于 NCD 与优化函数结合的非线性优化 PID 控制 1. 引言 NCD&#xff08;Normalized Coprime Factorization Distance&#xff09;优化是一种用于非线性系统的先进控制方法。通过将 NCD 指标与优化算法结合&#xff0c;可以在动态调整控制参数的同时优化控制器性能。此方法特别…

数据库表设计范式

华子目录 MYSQL库表设计&#xff1a;范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;三范式小结巴斯-科德范式&#xff08;BCNF&#xff09;第四范式&#xff08;4NF&#xff09;第五范式&#xff08;5NF&…

中国省级新质生产力发展指数数据(任宇新版本)2010-2023年

一、测算方式&#xff1a;参考C刊《财经理论与实践》任宇新&#xff08;2024&#xff09;老师的研究&#xff0c;新质生产力以劳动者劳动资料劳动对象及其优化组合的质变为 基本内涵&#xff0c;借 鉴 王 珏 和 王 荣 基 的 做 法构建新质生产力发展水平评价指标体系如下所示&a…

【爬虫】Firecrawl对京东热卖网信息爬取(仅供学习)

项目地址 GitHub - mendableai/firecrawl: &#x1f525; Turn entire websites into LLM-ready markdown or structured data. Scrape, crawl and extract with a single API. Firecrawl更多是使用在LLM大模型知识库的构建&#xff0c;是大模型数据准备中的一环&#xff08;在…

Admin.NET框架前端由于keep-alive设置缓存导致的onUnmount未触发问题

bug版本&#xff1a;next分支&#xff0c;基于.NET6版本&#xff1b; 问题描述&#xff1a; 1、添加keep-alive后&#xff0c;在其下运行的组件会出现onActived(被关注时)和onDeactived(取消关注时)生命周期&#xff0c;而组件原有生命周期为onMounted(被创造时)和onUnmounted(…

机器学习day7-线性回归3、逻辑回归、聚类、SVC

7欠拟合与过拟合 1.欠拟合 模型在训练数据上表现不佳&#xff0c;在新的数据上也表现不佳&#xff0c;常发生在模型过于简单无法处理数据中的复杂模式时。 特征&#xff1a; 训练误差较高 测试误差也高 模型过于简化&#xff0c;不能充分学习训练数据中的模式 2.过拟合 …

【鸿蒙开发】第二十二章 IPC与RPC进程间通讯服务

目录 1 IPC与RPC通信概述 2 实现原理 3 约束与限制 4 使用场景 5 开发步骤 5.1 Native侧开发步骤 5.2 ArkTS侧开发步骤 6 远端状态订阅开发实例 6.1 使用场景 6.1.1 Native侧接口 6.2 ArkTS侧接口 6.3 Stub感知Proxy消亡&#xff08;匿名Stub的使用&#xff09; 1 …

【开发小技巧11】用经典报表实现badge list效果,根据回显内容用颜色加以区分

之前使用badge list实现首页指标数据回显&#xff0c;但是无法根据对应数据进行个性化动态展示&#xff0c;那要如何解决呢&#xff1f;下面就来看看如何通过经典报表实现badge list效果&#xff0c;根据回显内容用颜色加以区分。 普通经典报表 想要做成类似这样的效果并且能…

rust中解决DPI-1047: Cannot locate a 64-bit Oracle Client library问题

我们在使用rust-oracle crate连接oracle进行测试的过程中&#xff0c;会发现无法连接oracle&#xff0c;测试运行过程中抛出“DPI-1047: Cannot locate a 64-bit Oracle Client library”错误。该问题是由于rust-oracle需要用到oracle的动态连接库&#xff0c;我们通过安装orac…

cocos creator 3.8 一些简单的操作技巧,材质的创建 1

这是一个飞机的3D模型与贴图 导入到cocos中&#xff0c;法线模型文件中已经包含了mesh、material、prefab&#xff0c;也就是模型、材质与预制。界面上创建一个空节点Plane&#xff0c;将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit&#xff0c;不需…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required&#xff1a; Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录&#xff0c;也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录&#xff0c;算一次会话…

数据集-目标检测系列- 荷花 莲花 检测数据集 lotus>> DataBall

数据集-目标检测系列- 荷花 莲花 检测数据集 lotus>> DataBall DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项…

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始&#xff0c;到0x90200结束

CTF 攻防世界 Web: SSRF Me write-up

题目名称-SSRF ME captcha 解码 目录扫描没有发现有用结果&#xff0c;根据提示 url 可能用来访问内部资源&#xff0c;根据题目名称可以猜测 ssrf。 其中 Captcha 用到 md5 加密截取&#xff0c;而且在每一次刷新网页时候会改变&#xff0c;可以写代码爆力枚举 Captcha 的值…

医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室

医学图像语义分割&#xff1a;前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室 语义分割网络FCN&#xff1a;通过将全连接层替换为卷积层并使用反卷积上采样&#xff0c;实现了第一个端到端的像素级分割网络U-Net&#xff1a;采用对称的U形编解码器结构&#xff…

WPF窗体基本知识-笔记-命名空间

窗体程序关闭方式 命名空间:可以理解命名空间的作用为引用下面的控件对象 给控件命名:一般都用x:Name,也可以用Name但是有的控件不支持 布局控件(容器)的类型 布局控件继承于Panel的控件,其中下面的border不是布局控件,panel是抽象类 在重叠的情况下,Zindex值越大的就在上面 Z…