代码随想录训练营Day24 | 134. 加油站 - 135. 分发糖果 - 860.柠檬水找零 - 406.根据身高重建队列

134. 加油站

  • 题目链接:134. 加油站

  • 思路:

    1. 由题意可得,需要能够走完所有的加油站,就需要保证车到达每一个加油站的时候有油,故先对gas和cost数组做差,得到每个加油站的油差,正代表着车在这里能加油,负代表着车要耗油;
    2. 做差之后就有两种思考方向,一种是滑动窗口做法,滑动窗口的最大长度为n-1,从第一个战开始模拟,累计油差和,如果油差和小于0,则需要更新起点,很容易想到,当油差和为负时,在这之前的所有加油站都不能作为起点,油差一定为负,如果油差和不为负,窗口大小为n-1时,找到了符合条件的起点,返回即可;
    3. 贪心思考方向,遍历数组保证油差和为正即可,油差和为负,更新起点和滑动窗口类似,同时记录,总的油差和,总的油差和为正代表着车能走完所有的加油站,具体思路见 卡哥讲解
    4. 画图法,如下图所示,每一条水平线的第一个交点为每次选择的汽车的起点,由图可以看到示例1,只能选择从起点3开始走,因为从图中可以看到,起点3为整个过程中汽车油耗能到达的最低位置,从油耗最低位置开始出发,就能保证整个过程油耗不会低于0,除非整体油差和为负;灵神讲解
      在这里插入图片描述
  • 代码:

class Solution {
public:// 方法1,滑动窗口int f1(vector<int>& gas, vector<int>& cost) {int n = gas.size();for(int i = 0; i < n; ++i) {gas[i] = gas[i] - cost[i];} int sum = 0, ans = 0;for(int i = 0; i < 2 * n; ++i) {sum += gas[i % n];if(sum < 0) {ans = i + 1;sum = 0;}if(i - ans >= n - 1)return ans;}return -1;}// 方法2,贪心思路int f2(vector<int>& gas, vector<int>& cost) {	int curSum = 0;int totalSum = 0;int start = 0;for (int i = 0; i < gas.size(); i++) {curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0start = i + 1;  // 起始位置更新为i+1curSum = 0;     // curSum从0开始}}if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了return start;}// 方法3,画图思路int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n = gas.size(), sum = 0, min_s = 0, ans = 0;for(int i = 0; i < n; ++i) {sum += gas[i] - cost[i];if(sum < min_s) { // 更新最小油耗位置min_s = sum; ans = i + 1;  // 确定起点}} // 如果油差和为负,代表着不可能走完,为正才能走完return sum < 0 ? -1 : ans;}};

135. 分发糖果

  • 题目链接:135. 分发糖果
  • 思路:
    1. 分发糖果,每个孩子都需要分到至少1个糖果,并且保证相邻孩子,评分高的孩子糖果要多;
    2. 相邻其实就是左右两边,保证孩子和左右两边相比分发的糖果要符合题意;
    3. 实际操作时,不能同时考虑左右两边的情况,所以先考虑一边,然后考虑另一边的情况,即先只看孩子和左边的孩子比较,保证评分高的多分发1个糖果,分发完了之后,再看右边,两次操作即可;
    4. 这里有个优化的点,考虑完左边之后,再从后往前考虑右边的时候,分发糖果时记录前一个孩子分发的糖果的数量即可,因为每次比较只比较 i 和 i + 1两个孩子,记录i + 1孩子分发糖果的数量,比较评分就能直接得到第 i 个孩子要分发糖果的数量,得到之后,和从左往右分发的糖果比较,取最大值就是最终的这个孩子要分发的糖果数量
  • 代码:
class Solution {
public:// 两次操作,从前往后只考虑左边,从后往前只考虑右边int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i = 1; i < ratings.size(); i++) {if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;}// 从后向前for (int i = ratings.size() - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1] ) {candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);}}// 统计结果int result = 0;for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];return result;}int f1(vector<int>& ratings) {int n = ratings.size();int ans = 0;vector<int> candy(n, 0);for(int i = 0; i < n; i++) {if(i > 0 && ratings[i] > ratings[i-1]) { // 从前往后只考虑左边,记录每个孩子分发糖果数量candy[i] = candy[i-1] + 1;} else  {candy[i] = 1;}}// 从后往前,只记录前一个孩子分发糖果数量int right = 0, ret = 0;for (int i = n - 1; i >= 0; i--) {if (i < n - 1 && ratings[i] > ratings[i + 1]) {right++; // 评分高,分发糖果数量比右边要多一个} else {right = 1;}// candy[i]保证符合左边要求,right保证符合右边要求,最大值保证符合两边要求ret += max(candy[i], right);}return ret;}
};

860.柠檬水找零

  • 题目链接:860.柠檬水找零
  • 思路:记录每卖出一瓶柠檬水获取的币值的数量,枚举需要找零的三种情况,每种情况需要减去5和10两种币值的数量,判断币值数量是否大于 >= 0,不符合则无法正确找零
  • 代码:
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0;for (int b : bills) {if (b == 5) { // 无需找零five++;} else if (b == 10) { // 返还 5five--;ten++;} else if (ten > 0) { // 此时 b=20,返还 10+5five--;ten--;} else { // 此时 b=20,返还 5+5+5five -= 3;}if (five < 0) { // 无法正确找零return false;}}return true;}
};

406.根据身高重建队列

  • 题目链接:406.根据身高重建队列
  • 思路:本题需要找到每个人的正确位置,题目给的条件是记录了每个人前面比当前身高大的人的数量,所以按照每次找一个人,放入到队列的正确位置的这种思考方向,每次先找身高高的,这样等到身高低的能够直接确定位置,身高一样的,按照前面比他身高高的数量排序,这样就能找到正确顺序
  • 代码:
class Solution {
public:vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {// 按照身高排序,降序排序ranges::sort(people, [](vector<int> a, vector<int> b) {if(a[0] == b[0]) return a[1] < b[1];return a[0] > b[0];});list<vector<int>> qe;for(int i = 0; i < people.size(); ++i) {int idx = people[i][1];std::list<vector<int>>::iterator it = qe.begin();while (idx--) { // 寻找在插入位置it++;}qe.insert(it, people[i]);}return vector<vector<int>> (qe.begin(), qe.end());}
};

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

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

相关文章

Burp Suite 专业版使用【Mac版本 m1处理器】

前言 Burp Suite 专业版(Professional)是需要付费使用的,但是社区版(Community)是免费的,下图第一个下拉框可以切换专业版和社区版本。 Burp Suite 专业版如果没有License key,是不能正常使用的,下边是在没有购买License key的情况下使用Burp Suite 专业版的方法。 本文是…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …

【热门主题】000044 大数据治理:开启数据时代新征程

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象&#xff0c;是用于传输数据的对象&#xff0c;通常在服务层与表现层之间传递数据&#xff0c;DTO 通常用于…

35岁程序员的四条职业发展路径:提前规划,迎接新起点

引言 20多岁&#xff1a;初入职场&#xff0c;怀揣梦想&#xff0c;对未来充满期待。30多岁&#xff1a;面临家庭与事业的双重压力&#xff0c;开始感到迷茫与焦虑。40岁&#xff1a;步入中年&#xff0c;如何在激烈的职场竞争中保持优势&#xff0c;继续书写精彩人生&#xf…

C++提高编程-泛型编程

一、模板&#xff1a; 1.1.模板的概念: 1.模板就是建立通用的模具&#xff0c;大大提高复用性2.例如生活中的模板: 一寸照片模板&#xff1a; PPT模板&#xff1a; 模板的特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架模板的通用并不是万能的 二、泛型编…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

Java学习——Day12

多态指的是同一个方法不同对象调用会有不同的行为&#xff0c;多态是方法的多态&#xff0c;属性没有多态&#xff0c;多态要有继承和重写。 这就是多态&#xff0c;其实原理也很简单&#xff0c;就是利用继承方法的重写实现的 对象的转型 向上转型&#xff1a;子类转成父类&…

AI生成字幕模型whisper介绍与使用

文章目录 前言一、whisper介绍二、预训练模型下载与环境配置三、推理 前言 随着人工智能技术的飞速发展&#xff0c;AI生成字幕模型已成为视频内容创作和传播领域的重要工具。其中&#xff0c;OpenAI推出的Whisper模型以其卓越的性能和广泛的应用场景&#xff0c;受到了广大用…

计算机毕业设计 | SpringBoot社区物业管理系统 小区管理(附源码)

1&#xff0c; 概述 1.1 课题背景 近几年来&#xff0c;随着物业相关的各种信息越来越多&#xff0c;比如报修维修、缴费、车位、访客等信息&#xff0c;对物业管理方面的需求越来越高&#xff0c;我们在工作中越来越多方面需要利用网页端管理系统来进行管理&#xff0c;我们…

4G与lora DTU农业监测应用数字化管理升级

农业监测的数字化管理升级&#xff0c;通过采用4G和LoRa等无线技术&#xff0c;解决渔业养殖、畜牧管理、农业灌溉以及远程监测等领域的互联互通。 渔业养殖水质监测 在渔业养殖中4G DTU通过采集各种水质传感器进行水质监测&#xff0c;4G DTU能够实时监测养殖水体的温度、pH值…

GA/T1400视图库平台EasyCVR视频融合平台HLS视频协议是什么?

在数字化时代&#xff0c;视频监控系统已成为保障安全、提升效率的关键技术。EasyCVR视频融合云平台&#xff0c;作为TSINGSEE青犀视频在“云边端”架构体系中的重要一环&#xff0c;专为大中型项目设计&#xff0c;提供了一个跨区域、网络化的视频监控综合管理系统平台。它不仅…

maven工程修改jdk编译版本的几种方法

一.背景 maven工程修改jdk编译版本的几种方法&#xff0c;以前这些小细节处理了就处理了&#xff0c;没有去记录&#xff0c;现在带徒弟&#xff0c;就写下吧&#xff01;可能不全面&#xff0c;不喜勿喷。哦&#xff0c;说下&#xff0c;本文的例子是在eclipse中开发截图的。 …

详细介绍Transformer!

&#x1f917;Transformer是一种神经网络架构&#xff0c;核心思想是利用自注意力机制来捕捉序列中元素之间的关系。从而避免了传统RNN难以处理长序列依赖的问题。 Transformer的主要组件和流程 &#x1f4ab;Encoder-Decoder结构 Transformer包含编码器和解码器两个主要部分…

中国车牌分类

从颜色和单双层分类(不考虑临时车牌) 黄单黄双黄绿单蓝单蓝双绿单绿双黑单黑双白单白双 #特殊文字 挂使港澳学警领临

【4060显卡也能跑高质量的Flux模型了吗】MIT Han 实验室开源了一个Flux的量化项目——SVDQuant

麻省理工学院&#xff08;MIT&#xff09;Han 实验室一直在积极开展一系列项目&#xff0c;包括微小机器学习&#xff08;Tiny Machine Learning&#xff09;、SANA、SVDQuant 和 QServe&#xff0c;这些项目旨在提高人工智能计算的效率&#xff0c;并实现在边缘设备上的高效部…

基于Java Springboot学生管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL5.7 数据库管理…

DELL Precision 系列默认用的都是非ECC内存

文章目录 DELL Precision 系列默认用的都是非ECC内存概述SSD升级SSD1SSD2 笔记DELL Precision 系列默认用的都是非ECC内存可以选非ECC的内存 备注备注如果不差钱备注END DELL Precision 系列默认用的都是非ECC内存 概述 去了一次DELL维修中心&#xff0c;清了一次灰。人工真贵…

Linux基础(2)以及资源耗尽病毒的编写(详见B站泷羽sec)

免责声明&#xff1a;本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害&#xff0c;包括但不限于数据丢失、系统损坏、个人隐私泄露或经济损失等&#xff0c;不承担任何责任。所有使用本教程内容的个人或组织应自行承担全部风险。 Linux…

20241114软考架构-------软考案例15答案

每日打卡题案例15答案 15.【2016年真题】 难度&#xff1a;一般 阅读以下关于应用服务器的叙述&#xff0c;在答题纸上回答问题1至问题3。&#xff08;25分&#xff09; 【说明】 某电子产品制造公司&#xff0c;几年前开发建设了企业网站系统&#xff0c;实现了企业宣传、产品…