算法:加油站

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、问题描述

二、原始解法

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

在一条环路上有N个加油站,其中第i个加油站有汽油 a[i] 

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 b[i] 升。你从其中的一个加油站出发,开始时油箱为空。

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1

输入: 
a  = [1,2,3,4,5]
b = [3,4,5,1,2]
输出: 3

输入: 
a  = [2,3,4]
b = [3,4,3]
输出: -1

二、原始解法

解题思路:

首先,汽车是加了油,然后才能跑下一段路程,到下一个目的地,如果油量不足,就从下一个目的地始发,循环往复,直到最后一个目的地,如果最后一个目的地符合,则需要从第一个节点再重新出发,到达倒数第二个节点,这样就完成了整个环行路的遍历。

代码示例:

public void test() {// 记录油量int[] a = new int[]{2, 4, 5};// 记录每一段举例的路程int[] b = new int[]{3, 5, 6};// 记录从第几个节点出发int index = 0;// 记录剩余油量int left = 0;boolean result = true;while (index < a.length) {for (int i = index; i < a.length; i++) {if (left + a[i] < b[i]) {// 当前节点出发不能满足, 则记录节点的索引index向前推进, index直接跳到下一个节点, 即为i+1index = i + 1;// 重置剩余油量left = 0;// 设置当前结果result = false;continue;}// 计算剩余油量left = left + a[i] - b[i];// 设置当前结果result = true;}// 从0开始, 整个循环如果结束, 且结果为通过, 则跳出while循环if (result) {break;}}// 如果index位于0到a.length-1之间, 说明前边是成功的, 需要将0到index之间的再走一遍, 这一遍比较特殊, 只需要从前到后判断一次即可if (index > 0 && index < a.length && left >= 0) {for (int i = 0; i < index; i++) {if (left + a[i] < b[i]) {// 不通过, 设置最后的结果result = false;// 跳出循环break;}// 计算剩余油量left = left + a[i] - b[i];// 设置当前结果result = true;}}// 输出结果System.out.println(result);// 输出第一个符合的出发点System.out.println(index < a.length ? index : -1);}

这种算法理解起来比较简单,主要要记录一下本次出发的起点,结果以及剩余油量

当遇到类似的问题时,可以先用最小的例子来攻破,比如我们就用两个数组,每个数组里只有2个元素,推导一下整个过程,然后转化成代码,然后再验证,随后再增加到3个元素,进行验证,查漏补缺,基本上就没问题了。

三、原始解法-简化

解题思路:

在上边思路的基础上,从另一个角度去想,首先我们要保证,油的总量要大于等于路程,其次,找到出发的位置,这个位置出发,加上后续的补充,能保证油是足够的。

代码示例:

public void test1() {int[] a = new int[]{1, 3, 8};int[] b = new int[]{2, 4, 5};int index = 0, total = 0, left = 0;for (int i = 0; i < a.length; i++)if ((left = left + a[i] - b[i]) < 0) {index = i + 1;total += left;left = 0;}System.out.println((total + left < 0) ? -1 : index);
}

这种解法,省略了从中部节点开始,到绕回来从0开始的这段逻辑。增加了一个(油-路程)差值的统计。 


总结

复杂的搞不懂,先上简单的算法,简单到有手就行!

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

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

相关文章

深度解析高防产品---游戏盾

游戏盾是针对游戏行业所推出的高度可定制的网络安全解决方案&#xff0c;游戏盾是高防产品系列中针对游戏行业的安全解决方案。游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。游戏盾通过分布式的抗D节点&#xff0c;可以防御TB级大…

@PersistenceContext和@Autowired在EntityManager上应用的不同

首先PersistenceContext是jpa专有的注解&#xff0c;而Autowired是spring自带的注释 上方图片的意思就是EntityManager不是线程安全的&#xff0c;当多个请求进来的时候&#xff0c;spring会创建多个线程&#xff0c;而PersistenceContext就是用来为每个线程创建一个EntityMana…

AI渲染:改变图像和视频制作的技术革命

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其应用领域已经覆盖了从医疗、教育到娱乐、艺术等各个行业。其中&#xff0c;AI在图像和视频制作领域的应用尤为引人注目&#xff0c;而AI渲染则是这一领域中的一颗璀璨明珠。AI渲染利用人工智能算法对图像和…

智能外呼系统全新升级,携手企业迈向高效转化新时代

智能外呼系统已成为企业提升业务效率和转化率的重要工具。随着人工智能技术的不断进步&#xff0c;智能外呼系统迎来了全面升级&#xff0c;旨在进一步助力企业优化客户沟通流程&#xff0c;提高业务转化效率。 新升级的智能外呼系统采用了更先进的自然语言处理技术&#xff0c…

Linux free命令使用教程(free指令)(查看内存、系统内存、内存占用、内存使用情况)

文章目录 Linux free命令使用教程1. free命令简介2. free命令选项2.1 显示单位&#xff08;free -b、free -k、free -m、free -g&#xff09;2.2 使用人类可读的格式&#xff08;free -h&#xff09;2.3 显示总计数&#xff08;free -t&#xff09;2.4 连续监视内存使用 3. 解析…

新疆老人扶梯摔倒铁路民警秒速救援 揭秘富维智能识别跌倒技术

近日&#xff0c;吐鲁番北站进站口一位年长的乘客在火车站的扶梯上突然失去平衡摔倒了&#xff0c;紧张的一幕在铁路民警的快速反应下得到了及时的处理。这位民警的敏捷和专业救援能力赢得了大家的称赞&#xff0c;同时也让我们思考&#xff1a;如何更好地及时报警这类事故的发…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

马斯克谈六西格玛:管理质量与火箭科学如何相辅相成

如果你问我&#xff0c;作为一个有志于送人类上火星的家伙&#xff0c;六西格玛管理有没有用&#xff1f;我会说&#xff0c;如果把火箭控制的精度与六西格玛得到的生产质量相比&#xff0c;你会发现两者都追求同一件事&#xff1a;接近零缺陷的完美。 六西格玛不只是一组工具…

elasticsearch系列七:聚合查询

概述 今天咱们来看下es中的聚合查询&#xff0c;在es中聚合查询分为三大类bucket、metrics、pipeline&#xff0c;每一大类下又有十几种小类&#xff0c;咱们各举例集中&#xff0c;有兴许的同学可以参考官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/refere…

np.copy()是深拷贝还是浅拷贝

np.copy到底是深拷贝还是浅拷贝 实验1. 拷贝矩阵2. 修改m的值3. 修改拷贝矩阵的值 官方文档参考文档 最近在用numpy的拷贝操作&#xff0c;发现网上对np.copy()究竟是深拷贝还是浅拷贝说法不一致&#xff0c;因此记录一下。 总结&#xff1a;如果numpy array是一个简单的数组&…

yolov7中添加fppi评价指标

参考&#xff1a;https://blog.csdn.net/liuhao3285/article/details/135233281?spm1001.2014.3001.5502 fppifp/image_num yolov7中增加FPPI FPPI实现 yolo7中的评价指标实现位于utils/metrics.py中&#xff0c;我们只需要参照mAP指标在其中增加FPPI的内容即可&#xff1a;…

6、LLaVA

简介 LLaVA官网 LLaVA使用Vicuna(LLaMA-2)作为LLM f ϕ ( ⋅ ) f_\phi() fϕ​(⋅)&#xff0c;使用预训练的CLIP图像编码器 ViT-L/14 g ( X v ) g(X_v) g(Xv​)。 输入图像 X v X_v Xv​&#xff0c;首先获取feature Z v g ( X v ) Z_vg(X_v) Zv​g(Xv​)。考虑到最后一…

复试 || 就业day03(2023.12.29)算法篇

文章目录 前言同构字符串存在重复元素有效的字母异位词丢失的数字单词规律 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛谷或其他刷题平台 &#x1f4ab;欢迎大…

【Linux系统编程二十五】:线程概念(Linux中的轻量级进程)

【Linux系统编程二十五】&#xff1a;线程概念(Linux中的轻量级进程&#xff09; 一.线程的概念1.地址空间是资源窗口 二.线程初步理解1.进程执行分支(内部运行)2.执行粒度更细3.重构进程概念&#xff1a;系统资源分配的基本实体4.重构线程概念&#xff1a;系统调度的基本单位5…

springcloud中使用openfeign来优化接口调用

简单介绍在springcloud中使用openfeign来优化接口调用 目录 一、引入依赖二、为服务提供者编写openfeign接口三、服务消费者调用定义的openfeign接口四、项目结构五、日志级别配置1、通过配置类进行全局配置2、通过配置类进行局部配置3、通过配置文件配置 一、引入依赖 <!-…

业务中台-上线切换计划篇

业务中台上线&#xff0c;是一项涉及众多复杂环节的重大任务。以我们当前的项目为例&#xff0c;新增接口多达50多个&#xff0c;原系统接口需调整30多个&#xff0c;同时还需要处理流程、期初数据、数据迁移、人员、权限等各个方面。结合我在项目中的实际经验&#xff0c;本文…

3D展2D数学原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

车联网的安全风险与应对措施

安全风险 1、恶意软件 攻击者可以通过入侵厂商或供应商网络&#xff0c;用恶意软件&#xff08;如病毒、木马、勒索软件等&#xff09;感染车联网系统组件&#xff0c;从而获得对车辆的控制权或窃取敏感信息。例如&#xff0c;一名安全研究人员成功入侵了特斯拉&#xff08;T…

量化原理入门——Folding BN RELU

本文介绍量化中如何将BatchNorm和ReLU合并到Conv中。 Folding BatchNorm BatchNorm是google提出的一种加速神经网络训练的技术&#xff0c;在很多网络中基本是标配。回忆一下BatchNorm其实就是在每一层输出的时候做了一遍归一化操作&#xff1a; Input:Values of x over a mi…

UE4开发BIM程序 的 流程

某机构BIM设计研究中心主任马晓龙&#xff0c;他对编程颇有研究。今天他会用通俗易懂的语言来讲解基于游戏引擎UE4的BIM技术可视化应用。对于想要自己开发程序的设计师一定要读一下&#xff01; 1&#xff09;关于UE4——UE4是什么&#xff1f; 可以简单的理解为&#xff0c;一…