【力扣刷题 | 第十九天】

news2024/11/25 6:34:11

目录

前言:

135. 分发糖果 - 力扣(LeetCode)

860. 柠檬水找零 - 力扣(LeetCode)

 总结:


前言:

        今天着重刷贪心算法的题目 

135. 分发糖果 - 力扣(LeetCode)

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

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

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

 这道题的难点在于如何确定当前孩子所得的糖果值一定始终比两边孩子所得到的糖果多,很多人会想到对每一个孩子的左右同时进行比较,写成了这种(也有的只是把):

      for(int i=0;i<ratings.size()-1;i++)
       {
           if(ratings[i]<ratings[i+1])
           {
               nums[i+1]=1+nums[i];
           }
           else if(ratings[i]>ratings[i+1] )
           {
               nums[i]=nums[i+1]+1;
           }
       }

但实际上这种做法是有漏洞的,因为实际上在比较的时候,每一个孩子手里的糖果数量都会发生变化,而相应的如果要多的话,也就要进行动态调整,如果按照上面的写法,就容易出现这种,也就是3一开始比2大,因此3拿两颗糖果

初始:

 

最终:

 

解释:最开始都是1,3比2大,因此3的糖果加一变为2,再向后2比1大,加一,因此2的糖果书加一变为2,我们发现忽略了两个都加之后,3明明比2大,但是我们因为是一直向后遍历,并没有考虑到实时变化,因此才会出现这种情况

因此不能使用这种,很多人又会想到把这两个if语句分开,但实质上动态调整不是拆分if的问题,而是遍历顺序的问题,在比较左右孩子的时候,我们在比较完一侧孩子之后,在比较另一次的时候,应该从后往前遍历,这样才可以实时掌握变化。

因此这道题最好的方法就是拆开比较,我们先保证每一个孩子一定比他左边的孩子拿到的糖果多,再保证每一个孩子一定比他右边的孩子拿到的糖果多,这个来进行解题

其实这道题的核心并不在于怎么分糖果,因为这很好想清楚:我们如果想尽可能少的分糖果,就只多一颗

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> nums(ratings.size(),1);
       
        // 一定比左边的孩子拿到的多
        for(int i=1;i<ratings.size();i++)
        {
            if(ratings[i]>ratings[i-1] )
            {
                nums[i]=1+nums[i-1];
            }
        }

        // 一定比右边的孩子拿到的多
         for (int i = ratings.size() - 2; i >= 0; i--) 
         {
            if (ratings[i] > ratings[i + 1] )
            {
               nums[i] = max(nums[i], nums[i + 1] + 1);
            }
        }
        int sum = 0;
        for(int i=0;i<nums.size();i++)
        {
            sum = sum + nums[i];
        }
        return sum;
    }
};

860. 柠檬水找零 - 力扣(LeetCode)

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

思路很清晰的一道题,时刻记录当前手里的5 和 10钞票面额就可以了,每一次找零前进行判断是否够找零,不用纪录20的张数,因为这个题最大找零是15。唯一贪心 的地方是:因为 5 元既可以找10元,也可以找20,因此在找20的时候,我们优先消耗10,这样才可以尽可能多的找零。

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0;
        for (int bill : bills) {
          
            if (bill == 5) 
            {
                five++;
            }
          
            if (bill == 10) {
                if (five <= 0)
                {
                    return false;
                } 
                ten++;
                five--;
            }
            
            if (bill == 20) {
              
                if (five > 0 && ten > 0)
                {
                    five--;
                    ten--;
                   
                } else if (five >= 3) {
                    five -= 3;
               
                } else return false;
            }
        }
        return true;
    }
};

 总结:

        两道题都是贪心算法题目,尤其是柠檬水题目,我一开始还想着用数组来存储当前拥有的零钱,大大增加了题的复杂程度,其实可以直接用变量来记录的,下次做题前一定要思维足够开阔! 

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

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

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

相关文章

Deepin/UOS Linux 桌面自定义 IDEA/DataGrip 应用程序图标

在 $HOME/Desktop目录下编辑 vim jetbrains.intelij.idea.desktop [Desktop Entry] TypeApplication NameIntelij IDEA Icon/opt/module/idea-IU-203.8084.24/bin/idea.png Exec/opt/module/idea-IU-203.8084.24/bin/idea.sh Terminalfalse CategoriesDevelopment;IDE;vim je…

力扣“找出数组排序后的目标下标”:一种简洁高效的算法

本篇博客会讲解力扣“2089. 找出数组排序后的目标下标”的解题思路&#xff0c;这是题目链接。 本题的解题思路如下&#xff1a;首先&#xff0c;利用qsort函数对原数组进行升序排序&#xff0c;然后&#xff0c;根据目标值在排序后的数组中查找对应的下标&#xff0c;并将其存…

Pixi + Tone 实现简单midi音频可视化

依赖库 Pixi.js 是一个前端图形渲染库&#xff0c;使用精灵技术绘制高性能的图形。Tone.js是一个前端音频框架&#xff0c;对web audio api进行了封装&#xff0c;可以快速创建音频样本、音频效果、进行音频分析和音频播放。tonejs/midi是tonejs的一个插件&#xff0c;可以讲m…

Iterator-Generator详解

1 迭代器可迭代对象 2 原生的迭代器对象 3 自定义类的迭代器 4 生成器理解和作用 5 自定义生成器方案 6 异步处理方案解析 迭代器-JavaScript中迭代器&#xff08;了解&#xff09; 给某个数组专门添加一个迭代器的代码。 const names ["abc", "cba"…

诚迈科技子公司智达诚远精耕智能驾驶,为商用落地注入创新力量

近期&#xff0c;工业和信息化部副部长辛国斌在新闻发布会上表示&#xff0c;将启动智能网联汽车准入和上路通行试点&#xff0c;组织开展城市级“车路云一体化”示范应用&#xff0c;将支持L3级及更高级别的自动驾驶功能商业化应用。根据工信部最新消息&#xff0c;《智能网联…

微聊测试报告

文章目录 微聊测试用例功能测试自动化测试注册页面登录页面会话窗口朋友圈界面 界面测试注册页面登录页面会话页面朋友圈页面 兼容性测试PCPad手机浏览器 性能测试安全测试密码保存是否安全SQL注入服务器错发 网络有网弱网断网 ​&#x1f451;作者主页&#xff1a;Java冰激凌 …

Pinia学习笔记 | 入门 - 映射辅助函数

文章目录 Pinia学习笔记简介Pinia是什么 代码分割机制案例1.挂载PiniaVue3Vue2&#xff1a;安装PiniaVuePlugin插件 2.定义store的两种方式options API 和 composition API使用options API模式定义使用composition API模式 2.业务组件对store的使用创建store实例解构访问Pinia容…

Vue学习笔记 之 Svg图标组件的实现步骤

1、安装依赖 首先需要安装svg-sprite-loader依赖&#xff0c;命令如下&#xff0c;这在在学习的过程中&#xff0c;就是因为没有下载该依赖&#xff0c;导致图标一直无法正常显示。 npm install svg-sprite-loader --save-dev --force2、配置svg图片处理规则 通过使用svg-spri…

【嵌入式Linux内核驱动】SPI子系统 | 硬件原理 | 应用编程 | 内核驱动 | 总体框架

1. 硬件原理 1.1 SPI通信协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线 四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08…

jmeter主要函数助手功用说明

jmeter中虽然有很多的插件&#xff0c;但是有些需要安装&#xff0c;有些具有一定的局限性。函数助手是一个快捷的工具库。下面记录一下函数助手中一些主要的函数的使用方法。 注&#xff1a;不内容中所有的实例均基于3.2记录 1、_BeanShell 表达式请求值后的值&#xff1a;可…

Hadoop之Hive安装

一、嵌入模式安装 1、下载Hive安装包 https://archive.apache.org/dist/hive/hive-1.2.1/ 2、上传至/root/export/software/ rz apache-hive-1.2.1-bin.tar.gz 3、解压 tar apache-hive-1.2.1-bin.tar.gz -C /root/export/servers/ cd /root/export/servers/apache-hive-1.2.…

openGauss学习笔记-09 openGauss 简单数据管理-创建数据库

文章目录 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库9.1 语法格式9.2 参数说明9.3 示例 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库 数据库安装完成后&#xff0c;默认生成名称为postgres的数据库。您需要自己创建一个新的数据库。 9.1 语法格式…

【Docker】Docker高级网络(NetWork)

【Docker】Docker高级网络(NetWork) 文章目录 【Docker】Docker高级网络(NetWork)1. 概述2. 网络2.1 网桥类型2.2 创建网络自定义桥2.3 查看所有网络2.4 查看特定网络的细节2.5 删除特定网络2.6 多个容器使用指定网络 参考文档&#xff1a;高级网络配置 Docker – 从入门到实践…

手机pdf怎么转换为图片?看看这几个转换方法

手机pdf怎么转换为图片&#xff1f;将手机图片转为PDF有很多好处。首先&#xff0c;PDF文件通常比图片文件更小&#xff0c;可以节省手机存储空间。其次&#xff0c;PDF文件可以更轻松地与他人共享&#xff0c;并且可以在不同设备和操作系统上打开。最后&#xff0c;将图片转换…

superheat | 超级简单的热图绘制解决方案!~(二)(聚类和注释图的添加~)

1写在前面 前面写了superheat的教程&#xff0c;今天写一下第二波&#xff0c;如何进行聚类以及添加注释图吧。&#x1f929; 分分钟提升你的heatmap的颜值哦&#xff01;~&#x1f970; 2用到的包 # devtools::install_github("rlbarter/superheat")library(superhe…

二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

各位CSDN的uu们你们好呀&#xff0c;今天继续数据结构与算法专栏中的二叉树&#xff0c;下面&#xff0c;让我们进入二叉树的世界吧&#xff01;&#xff01;&#xff01; 二叉树&#xff08;上&#xff09;——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 二叉树链…

TypeScript 中对【泛型】的定义使用方式解读

目录 泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型并且让类型更加灵活 泛型实现类型参…

Pycharm安装 leetcode 插件

目录 本节演示Pycharm安装 leetcode 插件做算法题 打开设置&#xff1a; 点击插件&#xff1a; 搜索leetcode并安装&#xff1a; 点这里的 leetcode&#xff1a; 初次使用点这里&#xff1a; 这里输入账号和密码&#xff1a; 点击确定后还是点登录&#xff1a; 登…

【MySQL】SQL入门(一)

&#x1f697;MySQL学习起始站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 ❤️每章节附章节思维导图&#xff0c;文末附全文思维导图&#xff0c;感谢各位点赞收藏支出~ 一.引入 (1) SQL分类 SQL语句&#xff0c;根据其功能&#xff0c;主要分为四类&#x…

巧妙使用 CSS 渐变来实现波浪动画

目录 一、波浪的原理 二、曲面的绘制 三、波浪动画 四、文字波浪动画 五、总结一下 参考资料 之前看到coco[1]的这样一篇文章&#xff1a;纯 CSS 实现波浪效果&#xff01;[2]&#xff0c;非常巧妙&#xff0c;通过改变border-radius和不断旋转实现的波浪效果&#xff0c…