【NO.15】LeetCode经典150题-135. 分发糖果

news/2024/9/14 14:25:40 标签: leetcode, 算法, 分发糖果

文章目录

  • 【NO.15】LeetCode经典150题-135. 分发糖果
  • 解题:贪心

【NO.15】LeetCode经典150题-135. 分发糖果

135. 分发糖果

【困难】

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

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

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

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

示例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

解题:贪心

我们可以将「相邻的孩子中,评分高的孩子必须获得更多的糖果」这句话拆分为两个规则,分别处理。

  • 左规则:当 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 数组,在计算右规则的时候只需要用单个变量记录当前位置的右规则,同时计算答案即可。

// 时间空间都为O(n)
class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        if (n == 1) {
            return 1;
        }
        int[] left = new int[n];
        for (int i = 0; i < n; i++) {
            if (i > 0 && ratings[i] > ratings[i-1]) {
                left[i] = left[i-1]+1;
            } else {
                left[i] = 1;
            }
        } 

        int result = 0;
        int right = 0;
        for (int i = n-1; i >= 0; i--) {
            if (i < n-1 && ratings[i] > ratings[i+1]) {
                right++;
            } else {
                right = 1;
            }
            result += Math.max(left[i], right);
        }

        return result;
    }
}

http://www.niftyadmin.cn/n/5632455.html

相关文章

Java图形用户界面之Applet设计

Applet设计 前言一、Applet的基本工作原理与使用局限Applet的基本工作原理代码示例 Java Applet 的使用局限Java沙箱安全机制原理 Applet的生命周期与运行方式 二、Applet类Applet类的层次结构常用方法生命周期方法显示方法多媒体支持方法其他方法 三、Applet和GUI基于AWT和Swi…

sealos快速搭建k8s集群

一&#xff0c;环境准备 1&#xff0c;三台&#xff08;搭建一主两从集群&#xff09;或五台&#xff08;三主两从集群&#xff09;虚拟机&#xff0c; 安装alimaLinux系统 &#xff0c;相同的root密码&#xff0c;不要安装docker。 如果是alimaLinux-mini版本操作系统&#xf…

docker部署流程

1、安装python容器 docker pull python:3.12.4 2、挂载本地目录及容器目录并分配一个伪输入输出&#xff0c;进入容器命令行 docker run -it --name pytest -v /Users/python_work/ai:/root/text_similar python:3.12.4 bash 3、拉取python项目需要依赖包 pip3 install XXX …

Angular17(3):Angular项目中引入iconfont

在Angular项目中引入Iconfont&#xff08;图标字体&#xff09;是一个常见的需求&#xff0c;用于在应用中添加丰富的图标资源。 Iconfont-阿里巴巴矢量图标库 1、点击进入官网&#xff0c;注册并登录 2、登陆成功后&#xff0c;首页的 资源管理 > 我的项目 点击进入 3、…

raksmart机云大宽带服务器托管服务内容

RakSmart是一家提供全球数据中心服务的公司&#xff0c;其业务范围涵盖了服务器托管、专用服务器租赁、云服务等多个领域。其中&#xff0c;机柜大带宽服务器托管服务是其特色之一&#xff0c;特别适合那些需要大量带宽资源的企业级客户。下面我们将详细介绍RakSmart的机柜大带…

自己开发完整项目一、登录功能-03(使用springSecurity安全框架,查询用户角色权限)

一、说明 在前面两章节&#xff0c;实现了通过springsecurity来进行用的登录认证&#xff0c;当用户输入用户名和密码之后&#xff0c;通过额数据库中的信息比对&#xff0c;比对成功那么放行。但是还存在一个问题&#xff1a;因为系统的所有页面包括按钮都是有各自的权限&…

策略模式+模版方法模式+简单工厂模式混用优化代码复杂分支问题

说明 这篇博客是在复杂场景使用策略和工厂模式代替分支语句升级版&#xff0c;增加了模版方法模式。将支付类的公共逻辑抽取到模板类中&#xff0c;使整个支付逻辑更加灵活&#xff0c;进一步优化了代码结构&#xff0c;提升了软件的可维护性和可读性。 流程图如下 先看一遍流…

MySQL5.7.36之主从复制延迟复制-centos7

设置从库sql_thread延时回放&#xff0c;使得从库晚于主库执行 1、开启延迟复制 第一步&#xff1a;关闭sql_thread线程 stop slave sql_thread; 第二步&#xff1a;设置延时时间(单位为秒) change master to master_delay60; 第三步&#xff1a;启动sql_thread线程 start sl…