贪心算法篇--代码随想录算法训练营第二十七天| 134. 加油站,135. 分发糖果,860.柠檬水找零

news2024/11/27 12:30:44

134. 加油站

题目链接:. - 力扣(LeetCode)

讲解视频:

贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站

题目描述:

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证它是唯一的。

示例 1:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

解题思路:

每个加油站的剩余量rest[i]为gas[i] - cost[i],i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。

全局最优:找到可以跑一圈的起始位置。

代码:

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int start = 0;
        int curSum = 0;
        int totalSum = 0;
        for(int i = 0; i < gas.size(); i ++)
        {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if(curSum < 0) 
            {
                start = i+1;
                curSum = 0;
            }
        }
        if(totalSum < 0) return -1;
        else return start;
    }
};

135. 分发糖果

题目链接:. - 力扣(LeetCode)

讲解视频:

贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果

题目描述:

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:

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

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

示例 1:

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

解题思路:

不能同时兼顾左右,需要先考虑一边,再考虑另一边。即先从前往后遍历一遍,再从后往前遍历一遍。

1、先确定右边评分大于左边的情况,即从前往后遍历:

局部最优:只要右边评分比左边大,右边的孩子就多一个糖果。

全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果

2、再确定左边评分大于右边的情况,即从后往前遍历:

局部最优:取candyVec[i + 1] + 1 和 candyVec[i] (第i个小孩的糖果数量)最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。

全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

代码:

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> getCandy(ratings.size(),1);
        if(ratings.size() == 1) return 1;

        //从前往后遍历
        for(int i = 1; i < ratings.size(); i++)
            if(ratings[i-1] < ratings[i]) 
                getCandy[i] = getCandy[i-1]+1;
        //从后往前遍历
        for(int i = ratings.size()-1; i > 0; i--)
            if(ratings[i] < ratings[i-1]) 
                getCandy[i-1] = max(getCandy[i]+1,getCandy[i-1]);

        int sum = 0;
        for(auto x : getCandy) sum += x;
        return sum;
        
    }
};

860.柠檬水找零

题目链接:. - 力扣(LeetCode)

讲解视频:

贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零

题目描述:

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

示例 1:

输入:bills = [5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。

解题思路:

有如下三种情况:

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

局部最优:遇到账单20,优先消耗美元10,完成本次找零。

全局最优:完成全部账单的找零。

代码:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int nums[3] = {0};
        for(int i = 0; i < bills.size(); i++)
        {
            if(bills[i] == 5) nums[0]++;
            else if(bills[i] == 10)
            {
                if(nums[0] == 0) return false;
                else nums[0]--, nums[1]++;
            }
            else
            {
                if(nums[0] >= 1 && nums[1] >= 1)
                {
                    nums[0] --, nums[1]--;
                    nums[2]++;
                }
                else if(nums[0] >= 3 && nums[1] == 0)
                {
                    nums[0] -= 3;
                    nums[2]++;
                }
                else return false;
            }
        }
        return true;
    }
};

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

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

相关文章

如何设置 Visual Studio Code 的滚轮缩放功能

Visual Studio Code (VSCode) 是一个强大的代码编辑器&#xff0c;提供了许多便捷的功能来提高开发效率。其中之一就是通过滚轮缩放字体大小。以下是详细的设置步骤&#xff1a; 步骤 1&#xff1a;打开设置页面 首先&#xff0c;启动 Visual Studio Code。在左上角点击 “文…

【网红时代】揭秘网红IP分析与打造,专业自媒体运营攻略

在这个互联网高速发展的时代&#xff0c;网红IP和自媒体的影响力日益凸显&#xff0c;成为品牌传播和市场营销的重要力量。如何分析和打造网红IP&#xff0c;进行专业的自媒体运营&#xff0c;成为许多企业和个人关注的焦点。今天&#xff0c;让我们一起探索网红IP的奥秘&#…

2024高端网站制作公司推荐TOP3

2024这个数字化高度发达的时间段&#xff0c;一个专业、高端的网站不仅是企业形象的展示窗口&#xff0c;更是连接用户与品牌的重要桥梁。 随着技术的不断进步和设计理念的不断创新&#xff0c;许多高端网站制作公司凭借其卓越的技术实力、创新的设计理念和丰富的项目经验&…

逻辑判断1-逻辑基础知识

目录 一、命题1.命题介绍2.复合命题1. 联合命题(且)2. 选言命题(或者、要么)3. 假言命题(如果、才、否则)3.模态命题(可能必然)4.直言命题(所有有些)5.充分必要条件二、推理方式一、命题 1.命题介绍 命题的四种形式和关系 命题传递规则 A→B,B→C,可联立,得出A→…

视频汇聚/安防综合管理系统EasyCVR非管理员账户能调用分配给其他用户的通道是什么原因?

视频汇聚/安防综合管理系统EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安…

请求转发与重定向

一、介绍 设想这样一种情况&#xff0c;在我们登录某个网站时&#xff0c;登录页面会要求我们输入账号密码以及其他信息&#xff0c;当我们点击登录按钮时&#xff0c;浏览器会将我们的信息以及请求的一些信息发送到服务器端&#xff0c;在服务器端&#xff0c;我们可以从requ…

haralyzer 半自动,一次性少量数据采集快捷方法

使用场景&#xff1a;半自动&#xff0c;一次性少量数据采集需求在工作中还是不少遇到的&#xff0c;无论使用模拟的方式&#xff0c;或者破解都不太划算。其实这种需求&#xff0c;使用半自动爬虫是最简单的。不需要考虑网站反爬虫的问题&#xff0c;因为你使用的就是真实的浏…

【MySQL】用户管理——用户、用户信息、创建用户、删除用户、修改用户密码、数据库的权限、给用户权限、回收权限

文章目录 MySQL1. 用户管理1.1 用户1.1.1 用户信息1.1.2 创建用户1.1.3 删除用户1.1.4 修改用户密码 1.2 数据库的权限1.2.1 给用户权限1.2.2 回收权限 MySQL 1. 用户管理 为什么MySQL要引入用户管理&#xff1f; 如果我们只能使用root用户&#xff0c;这样存在安全隐患。因为r…

【JavaEE初阶】文件内容的读写—数据流

目录 &#x1f4d5; 引言 &#x1f334; 数据流的概念 &#x1f6a9; 数据流分类 &#x1f333; 字节流的读写 &#x1f6a9; InputStream&#xff08;从文件中读取字节内容) &#x1f6a9; OutputStream&#xff08;向文件中写内容&#xff09; &#x1f384; 字符流的…

Java、python、php版的邮件发送与过滤系统的设计与实现 (源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

iMES工厂管家:强大的工厂管理系统

iMES工厂管家&#xff1a;强大的工厂管理系统 在现代工厂管理中&#xff0c;iMES工厂管家作为一款功能强大的MES系统&#xff0c;为用户提供了全面的管理解决方案。本文将介绍iMES工厂管家的基本信息、特点、以及如何快速部署和使用。 软件简介 iMES工厂管家是一款基于.NetCor…

Android Studio设置 offline 模式

gradle3.6之前版本 在setting中选中Offline Work选项 gradle3.6之后的版本

Tied and Anchored Stereo Attention Network for Cloud Removal in Optical

论文名称 基于固定锚定立体注意力网络的光学遥感图像去云方法代码运行 论文代码 https://github.com/ningjin00/TASANet?tabreadme-ov-file 论文地址 1环境创建 模型环境给了这几个包&#xff0c;如果你自带环境 那就运行代码 提示缺哪个装哪个 python 3.12rasterio 1.3.10…

330进口高强度螺丝产品优势

330进口高强度螺丝是一种高性能紧固件&#xff0c;广泛应用于汽车、航空航天、重型机械、能源、基础设施建设等多个领域。这些螺丝之所以受到青睐&#xff0c;是因为它们在设计、材料选择、制造工艺等方面都达到了非常高的标准&#xff0c;确保了产品的卓越性能。以下是330进口…

四款录屏大师,一键搞定!新手也能快速上手?

现在随着新媒体的记录设备的不断更新迭代之下&#xff0c;我们记录生活的工具也愈来愈强大&#xff0c;不过如果需要记录电脑中的重要信息时&#xff0c;我们就需要借助录屏工具来实现了&#xff0c;所以今天整理了四款实用靠谱的录屏大师&#xff0c;有需要的朋友可以试试&…

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段&#xff0c;C语言允许在一个结构体中以位为单位来指定其成员所占内存长度&#xff0c;这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下&#xff0c;我们均在VS2022的…

靶机:DC-4

一、信息收集 1、主机发现 nmap 192.168.236.0/24 2、端口扫描 nmap 192.168.236.175 -p- -A 3、目录扫描 dirb http://192.168.236.175 二、漏洞探测 访问80端口&#xff0c;发现登录页面 尝试爆破密码 hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.236…

python媒体下载工具 you-get

you-get 是一个基于 Python 3 的强大的命令行工具&#xff0c;使用方式简单&#xff0c;使用 you-get 可以很轻松的下载到网络上的各种媒体文件&#xff08;视频、图片及音乐等&#xff09;。 相关功能和配置选项&#xff0c;可以查阅以下以获取详细信息&#xff1a; GitHub 官…

【对抗性训练】FGM、AWP

FGM&#xff08;Fast Gradient Method&#xff09;和 AWP&#xff08;Adversarial Weight Perturbation&#xff09;是两种与对抗训练相关的技术&#xff0c;旨在提高深度学习模型的鲁棒性和防御能力。它们主要应用于对抗攻击&#xff08;adversarial attacks&#xff09;背景下…

换装的视频怎么拍的?原来可以这样做

换装的视频怎么拍的&#xff1f;在数字时代&#xff0c;换装视频以其独特的创意和视觉冲击力&#xff0c;成为了社交媒体上备受欢迎的内容形式。无论是展现时尚潮流&#xff0c;还是实现跨越时空的幻想&#xff0c;换装视频都能以惊人的效果吸引观众的目光。那么&#xff0c;如…