Leetcode135. 分发糖果

news2024/9/25 21:31:09

Every day a leetcode

题目来源:135. 分发糖果

解法1:贪心

首先把所有孩子的糖果数初始化为1。

从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加1。

再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加1。

代码:

#include <iostream>
using namespace std;

int candy(int *ratings, int ratingsSize);

int main()
{
    int n;
    cin >> n;
    int a[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    cout << candy(a, n) << endl;

    system("pause");
    return 0;
}

int candy(int *ratings, int ratingsSize)
{
    int n = ratingsSize;
    int candy[n];

    for (int i = 0; i < n; i++) // 每个孩子至少分配到1个糖果
    {
        candy[i] = 1;
        // cout << candy[i] << " ";
    }
    // cout << endl;
    // 从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加1
    for (int i = 0; i < n - 1; i++)
        if (ratings[i] < ratings[i + 1])
            candy[i + 1] = candy[i] + 1;
    // 从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,
    // 则左边孩子的糖果数更新为右边孩子的糖果数加1
    for (int i = n - 1; i > 0; i--)
        if (ratings[i - 1] > ratings[i] && candy[i - 1] <= candy[i])
            candy[i - 1] = candy[i] + 1;
    // 统计糖果总数
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += candy[i];
    return sum;
}


结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中n是孩子的数量。我们需要遍历两次数组以分别计算满足左规则或右规则的最少糖果数量。

空间复杂度:O(n),其中n是孩子的数量。我们需要candy数组储存糖果数。

解法2:常数空间遍历

注意到糖果总是尽量少给,且从1开始累计,每次要么比相邻的同学多给一个,要么重新置为1。

依据此规则,我们可以画出下图:

在这里插入图片描述

其中相同颜色的柱状图的高度总恰好为1,2,3,…。

而高度也不一定一定是升序,也可能是…,3,2,1。

注意到在上图中,对于第三个同学,他既可以被认为是属于绿色的升序部分,也可以被认为是属于蓝色的降序部分。因为他同时比两边的同学评分更高。我们对序列稍作修改:

在这里插入图片描述

注意到右边的升序部分变长了,使得第三个同学不得不被分配4个糖果。

依据前面总结的规律,我们可以提出本题的解法。我们从左到右枚举每一个同学,记前一个同学分得的糖果数量为pre:

如果当前同学比上一个同学评分高,说明我们就在最近的递增序列中,直接分配给该同学pre+1个糖果

否则我们就在一个递减序列中,我们直接分配给当前同学一个糖果,并把该同学所在的递减序列中所有的同学都再多分配一个糖果,以保证糖果数量还是满足条件。

我们无需显式地额外分配糖果,只需要记录当前的递减序列长度,即可知道需要额外分配的糖果数量。

同时注意当当前的递减序列长度和上一个递增序列等长时,需要把最近的递增序列的最后一个同学也并进递减序列中。

这样,我们只要记录当前递减序列的长度dec,最近的递增序列的长度inc和前一个同学分得的糖果数量pre即可。

代码:

int candy(int* ratings, int ratingsSize) {
    int ret = 1;
    int inc = 1, dec = 0, pre = 1;
    for (int i = 1; i < ratingsSize; i++) {
        if (ratings[i] >= ratings[i - 1]) {
            dec = 0;
            pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
            ret += pre;
            inc = pre;
        } else {
            dec++;
            if (dec == inc) {
                dec++;
            }
            ret += dec;
            pre = 1;
        }
    }
    return ret;
}

复杂度分析:

时间复杂度:O(n),其中n是孩子的数量。我们需要遍历1次数组。

空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

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

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

相关文章

匈牙利算法学习记录

匈牙利算法主要用来解决两个问题&#xff1a;求二分图的最大匹配数和最小点覆盖数。 匈牙利算法事实上有两个算法&#xff0c;分别解决指派问题和二分图最大匹配求解问题&#xff0c;此处算法指求解指派问题的匈牙利算法。 处理流程 方法一 具体如何实现呢&#xff1f; 代码…

【数据结构】- 初识数据结构之时间复杂度(上)

文章目录前言一、什么是数据结构二、什么是算法三、算法效率3.1如何衡量一个算法的好坏3.2算法复杂度四、时间复杂度4.1时间复杂度的概念4.2大O的渐进表示法4.3常见时间复杂度计算举例总结前言 努力不是为了和别人一较高下 而是为了让生活多一种可能 别让世俗淹没生活的浪漫和…

MySQL:基本常识介绍、操作数据库、操作数据库中的表、操作表中的数据(增删改查)、MySQL 函数

文章目录Day 02&#xff1a;一、常见的 SQL 语句二、基本常识1. 数据库的列类型2. 数据库的字段属性三、操作数据库1. 操作数据库2. 操作数据库中的表&#xff08;1&#xff09;创建表&#xff1a;CREAT&#xff08;2&#xff09;修改表&#xff1a;ALTER&#xff08;3&#xf…

肖 sir_就业课__014python讲解

python讲解 一、python梳理 1、python 数据类型有哪些&#xff1f; 字符、列表、元组、字典、集合 2、列表、元组、字典、集合的区别&#xff1f; 3、python中函数&#xff1f; &#xff08;1&#xff09;自定义函数 def 函数名&#xff08;&#xff09; &#xff08;2&#…

聊聊架构方案选择

大家好&#xff0c;我是易安&#xff01; 在完成备选方案设计后&#xff0c;如何挑选最终的方案是一个很大的挑战&#xff0c;因为每个备选方案都是可行的。但是&#xff0c;没有哪个备选方案是完美的&#xff0c;因为每个方案都存在一些缺点或风险。此外&#xff0c;评价备选方…

薅!无魔法无限量GPT-4安卓App安装包;Notion AI从入门到精通;最全大模型进展汇总;雇AI给我打零工 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『大模型进展汇总 (持续更新至4月17日)』应该是最全总结了吧 ShowMeAI资料编号 No.T001 &#xff08;进入社群获取高清PDF文件&#x…

AI已经解锁自动化能力 | 颠覆商业模式和劳动力市场

AI已经解锁自动化能力&#xff0c;将颠覆商业模式和劳动力市场。目前AutoGPT的开源项目&#xff1a; BabyAGI、Auto-GPT、AgentGPT、TeenagerAGI、Jarvis。 AutoGPT原理&#xff1a; 3个GPT4协同合作&#xff0c;一个GPT4负责分解目标创建任务&#xff0c;另一个GPT4负责分配…

面试必问的CAS原理你会了吗?

目录 一、什么是CAS&#xff1f; 二、CAS 基本原理 三、CAS 在 Java 语言中的应用 四、CAS 的问题 1、典型 ABA 问题 2、自旋开销问题 3、只能保证单个变量的原子性 五、有态度的总结 在并发编程中我们都知道i操作是非线程安全的&#xff0c;这是因为 i操作不是原子操作…

Jmeter常用断言之XPath断言

一般情况下&#xff0c;使用响应断言和json断言即可满足绝大部分断言需求&#xff0c;Xpath断言主要适用于&#xff1a;返回的数据格式为html或xml。 XPath是W3C的一个标准。XPath是一种表达式语言&#xff0c;它使用路径表达式来选取 XML 文档中的节点或节点集。XPath断言和XP…

Linux中jar包的启动脚本解析及问题

搭建运行环境时&#xff0c;把jar包打好外&#xff0c;我们还需要一个启动脚本&#xff0c;新建一个文件start.sh,内容如下&#xff1a; ps -ef | grep dvmrms | grep -v grep | awk {print $2} | xargs kill -9nohup java -jar dvmrms.jar >/dev/null 2>&1 &sl…

leetcode876.链表的中间节点

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【LeetCode】 目录题目链接解法1&#xff1a;快慢指针解题代码题目链接 题目链接 解法1&#xff1a;快慢指针 解法一&#xff1a;快慢指…

opencv实践项目-修改表格缺失轮廓

目录 1. 背景2. 修复步骤2.1 图像灰度化&#xff0c;并进行高斯模糊2.2 对图像进行阀值处理2.3 查找轮廓2.4 利用存储的值了解表格的位置2.5 提取所有的水平线和垂直线2.6 合并垂直和水平的两个模版 3. 完整代码 1. 背景 如果大家在输入图像时&#xff0c;看到的第二行中的单元…

Laravel使用JWT

开始安装jwt &#xff08;本次安装不建议直接在项目中安装及使用&#xff09; 1.composer 安装jwt composer require tymon/jwt-auth 1.0.0-rc.1 2.在config 文件夹的app.php 中注册服务提供者 providers > [Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]…

计算机网络考试复习——第一章 1.5 1.6

1.5 计算机网络的类别 1.5.1计算机网络的定义&#xff1a; 系统集合&#xff0c;连接起来&#xff0c;协议工作&#xff0c;资源共享 计算机网络主要是由一些通用的、可编程的硬件互连而成的&#xff0c;而这些硬件并非专门用来实现某一特定目的&#xff08;例如&#xff0…

【Linux问题处理】Aborted (core dumped)报错python

文章目录一、命令检查1.python执行py文件2.gdb执行py文件二、进程检查1.检查所有python程序2.使用gdb检查进程三、core文件检查1.开启core文件存储能力2.core文件存储位置3.gbd查看core文件首先需要在ubuntu系统安装gdb工具。 sudo apt-get install gdbgdb是c的工具&#xff0…

SSM框架整合流程与原理解读(附源码链接)

本文参考黑马教程&#xff0c;对 MyBatis、Spring、SpringMVC 三个框架进行逐步整合&#xff0c;并对整合后事务失效原因进行总结。 源码链接&#xff1a;https://download.csdn.net/download/weixin_43819566/87690821 文章目录 一、搭建整合环境1.1 整合项目说明1.2 整合的思…

通过KNN分类模型预测股票涨跌,然后与基准收益画图对比

目录 1 获取数据 2 特征工程&#xff1a;定义一个用于分类的函数 3 特征工程&#xff1a;生成训练数据 4 根据训练数据对分类模型进行拟合&#xff0c;并给出得分 5 使用训练完成的分类模型进行数据预测 6 定义几个有用的函数 7 生成基准收益和策略收益对比结果 记录一下…

排序算法——快速排序(C语言多种实现及其优化策略)

快速排序总述快速排序递归框架单趟快速排序**hoare法****挖坑法**前后指针法快排改进key的选取**随机选key****三数取中**小区间优化**面对多个重复数据时的乏力**总述 快速排序可以说是排序界的大哥的存在&#xff0c;在c库中的qsort和c库中的sort两个排序底层都是用快速排序…

常用运放电路总结记录

前言 上一篇文章我们复习了一下运放的基本知识&#xff0c;尽量的用简单的描述带大家去理解运算放大器&#xff1a; 带你理解运算放大器 对于运放的使用&#xff0c;存在着一些经典常用的应用电路&#xff0c;这个其实网络上已经有大量的文章做记录总结了&#xff0c;作为电…

【Elastic (ELK) Stack 实战教程】11、使用 ElastAlert 实现 ES 钉钉群日志告警

目录 一、ElastAlert 概述 二、安装 ElastAlert 2.1 安装依赖 2.2 安装 Python 环境 2.3 安装 ElastAlert 2.4 ElastAlert 配置文件 2.5 创建 ElastAlert 索引 2.6 测试告警配置是否正常 三、ElastAlert 集成钉钉 3.1 下载 ElastAlert 钉钉报警插件 3.2 创建钉钉机器…