LeetCode刷题:134. 加油站问题

《python算法与数据结构2000讲》0134. 加油站 一条环路上有 N 个加油站,第 i 个加油站有 gas[i] 升汽油。 现在有一辆油箱无限容量的汽车,从第 i 个加油站开往第 i + 1 个加油站需要消耗汽油 cost[i] 升。如果汽车上携带的有两不够 cost[i],则无法从第 i 个加油站开往第 i + 1 个加油站。 现在从其中一个加油站开始出发,且出发时油箱为空。如果能绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 阅读详情

134. 加油站

难度:中等

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/gas-station
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

问题描述:
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

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

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -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 可为起始索引。

示例 2:

输入: 
gas  = [2,3,4]
cost = [3,4,3]

输出: -1

解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

可以直接用暴力解法依次以每个加油站作为起点来开始,但这种解法的时间复杂度为O(n^2),因此介绍第二种时间复杂度为O(n)的解法。

思路:

  1. 先看总的存油量是否大于等于总的消耗量,如果不是,则return -1
  2. 依次遍历每个加油站,看当前的存油+补给量是否>=到达下一个站的消耗量,如果是,则继续走
  3. 如果无法到达下一个站,则直接从下一站开始继续检验到结尾

这里取巧的点在于,从第[0]站开始,假如无法到达第[3]站,可以推出来以第[1]站和第[2]站为起点也到不了第[3]站。为什么呢?,因为从第[0]站开始后,到达第[1]站时的存油肯定>=0,这样都无法到达第[3]站,那么以第[1]站为起点时存油为0更不可能到达(第[2]站同理),因此第[3]站以前的点可以都不用试了。

代码:

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        # 计算出总消耗和总补给
        total_gas = sum(gas)
        total_cost = sum(cost)
        # 如果总的消耗>总的补给,那肯定到不了终点
        if total_cost > total_gas:
            return -1
        n = len(gas)
        # 假设可以成功的起始站
        start = 0
        # 剩余油量
        current_gas = 0
        for i in range(n):
            # 当前站剩余油量 = 之前所有的存油 + 该站补给 - 到下一站消耗
            current_gas += gas[i] - cost[i]
            if current_gas < 0:
                current_gas = 0
                # 最终返回的站,为什么此时start = i + 1,因为比如当从第[2]站无法到达第[3]站时,就是再从第[3]站开始,此时i=2
                start = i + 1

        return start

视频讲解地址:https://www.bilibili.com/video/BV1wA411b7qZ?p=25

Java代码解决方案 - LeetCode第134题:加油站路径规划 LeetCode第134题,要求我们寻找一条从起点到终点的路径,在经过的每一个加油站都能够顺利加油,并最终抵达终点。这个问题是典型的图论中路径规划问题的一个变种,它要求解者不仅需要掌握图的遍历方法,而且需要理解并应用贪心算法的策略。在本章中,我们将详细探讨LeetCode第134题背后蕴含的逻辑以及解决它的思路和方法。这包括分析题目给定的条件,理解“油量”这一核心概念,以及如何合理地计算路径上的转折点。这些内容将为接下来章节中对问题更深入的探讨与代码实现奠定基础。 阅读详情

相关推荐

算法-加油站问题动态规划

算法-加油站问题动态规划

汽车加油问题(python)

接下来1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油,且在第0个加油站满油不算加油,第k+1个加油站表示目的地。3.汽车加油:当当前汽车所耗油耗累积+距离>n:则需要加油,将加油的次数+1,因为这个加的距离还没有走,所以更新当前汽车所耗油耗累积的值,并将其赋值为距离的值,此时才得以进行下一次迭代。所以无论汽车在哪个位置,当两个加油站之间的距离相差大于在加油站加满油后可行驶的距离n,那么肯定就无法到达目的地,输出"No Solution"

m0_74287804的博客 507

算法设计与分析汽车加油问题

某人自驾游,从A地往B地,期间共有n个加油站,汽车加满汽油可行驶n公里。已知沿途相邻两个站的距离依次是 : s1,s2,…,sn-1。请设计算法,为该人指定加油方案,使得他的加油次数最少。

Python | Leetcode Python题解之第134题加油站

Python | Leetcode Python题解之第134题加油站

Mopes__的博客 531

Android蓝牙Mesh组网实战:从零搭建智能灯光控制系统(附完整代码)

本文详细介绍了基于Android平台开发蓝牙Mesh智能灯光控制系统的完整实战流程。从环境搭建、核心概念解析,到设备扫描配网、网络初始化、模型配置与消息通信,提供了完整的代码实现和调试技巧。重点讲解了如何使用开源Mesh库实现设备发现、分组控制、场景管理等核心功能,并分享了实际项目中遇到的典型问题与解决方案。

weixin_29174013的博客 661

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2165

LeetCode(力扣)134. 加油站Python

【代码】LeetCode(力扣)134. 加油站Python。

qq_44953660的博客 452

新手也能搞定!用ADS 2023从零设计一个超宽带Wilkinson功分器(附完整版图)

本文详细介绍了如何使用ADS 2023从零开始设计超宽带Wilkinson功分器,涵盖介质板参数设置、微带线计算优化、版图生成验证等关键步骤。通过实例演示和常见问题排查,帮助射频工程新手快速掌握功分器设计技巧,提升设计效率。

weixin_42692935的博客 478

134. 加油站 Python

条路线能够让汽车行驶一周,并且都是从数组的左边往右边行驶的(到达头后又从左边开始向右行驶),我们可以从。的情况,则表明无论如何都不能行驶一周,此时则不需要去遍历所有站点,直接返回。出发,累加经过的加油站后的当前油量,如果发现当前的油量<0,则尝试从。,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回。当我们从左开始遍历完所有的站点后,就能找出能够行驶一周的开始站点(出发,重新开始累加计算经过的加油站后的当前油量,如果直到。你从其中的一个加油站出发,开始时油箱为空。当然,如果发现我们求得的。

小明 731

【Q1/论文复现】:利用 CHARLS 数据库考察抗高血压药物依从性和认知衰退

摘要: 北京大学团队基于CHARLS数据(2011-2018)的纵向研究发现,抗高血压药物高依从性能显著延缓中国45岁及以上社区中老年人的认知衰退。研究表明,坚持服药者7年内全局认知衰退速度降低0.014SD/年,记忆功能衰退减缓0.023SD/年,效果接近正常血压人群水平。研究还提示社会经济地位(SES)可能通过影响用药依从性间接调控认知衰老进程。该成果为高血压管理对认知保护提供了人群级证据,发表于《BMC Medicine》(DOI:10.1186/s12916-025-03949-8)。

dingdianbangni的博客 809

Android 13 系统定制:实现第三方Launcher预置与原生Launcher3的共存切换

本文详细介绍了在Android 13系统中实现第三方Launcher预置与原生Launcher3共存切换的技术方案。通过修改ResolverActivity逻辑、处理首次启动设置以及优化用户切换机制,开发者可以灵活定制默认Launcher,同时保留用户自由选择权。文章还提供了常见问题排查指南和性能优化建议,帮助提升双Launcher方案的稳定性和用户体验。

weixin_30275415的博客 128

LeetCode第134题_加油站

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

qq_40263592的博客 1183

第一讲:halcon模板匹配捆绑测量矩形检测芯片针脚

使用halcon模板匹配捆绑测量矩形,检测位置发生变换的芯片针脚缺陷。

uiopmn1的博客 2995

134. 加油站(力扣LeetCode)

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。返回这个加油站的索引。那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数?

m0_73841621的博客 1627

11、气动外形优化中的连续伴随方法

本文探讨了连续伴随方法在气动外形优化中的理论背景、实现和验证过程。通过使用DLR的FLOWer求解器,将伴随方法应用于Euler和Navier-Stokes方程,以高效计算成本函数梯度,从而显著减少优化过程中的计算成本。文章还介绍了该方法在RAE2822翼型和ONERA M6机翼等案例中的应用,并展示了其准确性和效率。未来展望包括扩展到复杂流动模拟和多学科优化。

desk3的博客 168

【软考高项】【计算专题】- 3 - 进度类 - 双代号网络图

共需压缩 20 天。在双代号网络图中,工作一般使用箭线表示,任意一条箭线都需要占用时间、消耗资源,工作名称写在箭线的上方,而消耗的时间则写在箭线的下方或者工作后面。反映的是前后工作的交接点,节点中的编号可以任意编写,但应保证后续工作的节点比前面节点的编号大,即上图图中的1⃣️4⃣️ 即表示 B 活动和 D 活动间有依赖关系,D 活动的开始,依赖 B 活动的结束。B活动完成了一半, 各计划的实际支出为A活动6500元, B活动1000元, C活动280元, D。

欢迎来到我的博客,一起探索代码里的世界! 4566

LeetCode(贪心)-134-加油站

贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站_哔哩哔哩_bilibili代码随想录 (programmercarl.com)

2301_81128256的博客 1899

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【NO.14】LeetCode经典150题-134. 加油站

加油站

wang_luwei的博客 903

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

​LeetCode刷题实战134:加油站

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ...

程序IT圈 557

面试经典题目:LeetCode134_加油站

从公式推导到代码形成

sun_0228的博客 1148

134. 加油站

本文介绍了如何高效解决LeetCode 134题的加油站问题。通过分析问题本质,提出了贪心算法的优化解法:1) 使用前缀和判断可行性;2) 当当前油量为负时,直接跳过不可能作为起点的区间。该算法只需一次遍历,时间复杂度O(N),空间复杂度O(1)。相比暴力解法,该方法通过数学洞察大幅提升了效率,是贪心算法应用的经典案例。

mrjieke6的博客 1497

力扣刷题记录 134. 加油站

该问题要求在环形路线上找到一个起点加油站,使得汽车能绕行一周。关键思路是维护总油量盈余和当前累计盈余,若总盈余为负则无解。遍历时,若当前累计盈余不足,则重置起点为下一站。时间复杂度O(n),空间复杂度O(1)。示例解法表明当gas=[1,2,3,4,5],cost=[3,4,5,1,2]时,应从索引3出发。常见误区包括误解行驶顺序和错误重置累计值。正确解法需确保从起点开始的连续累计盈余始终非负。

qq_60561423的博客 552

【LeetCode-134】加油站(贪心)

leetcode的每日一题

asdfasaa的博客 1288

leetcode134:加油站(图解贪心)

本文介绍了LeetCode 134题“加油站问题”的解题思路与实现。题目要求判断汽车能否绕环形路线行驶一周并返回唯一的起点加油站编号。通过分析暴力解法(O(N²))的局限性,提出基于贪心策略的O(N)解法。关键思路是计算油量净收益(gas[i] - cost[i])的累加和,找到油量最低点的下一个加油站作为起点。该解法在保证总油量足够的前提下(sum(gas) ≥ sum(cost)),通过一次遍历即可确定唯一解。代码实现简洁高效,时间复杂度O(N),空间复杂度O(1)。提交结果显示该方法能有效解决问题。

lyh2004_08的博客 1000

【力扣刷题】134. 加油站

题目来源: 134.加油站 - 力扣(LeetCode) 思路: 参考学习了两个思路的解法: (1)官方题解:在我看到第二种就是(2)用图的思想分析时,我觉得官方和大佬的想法在本质上不谋而合,共同点且核心都是利用油量的变化,只不过官方题解使用了两个变量——总油量和当前油量进行比较判断,微观上用当前油量判断,如果行驶到下一个加油站当前油量小于0,说明排除从这个加油站开始环绕一周的可能,ans=i+1;宏观上用总油量判断,如果行驶一周后总油量小于0,说明无法成功环绕一周。代码运行时间相比(2)较长。 加油站

HeyRena的博客 363

Leetcode 134. 加油站(贪心)

re其实代表着一个分割点,在其之前的所有点都不可能是始发点,因为它们的和值小于0,从它们中任何一个点出发,最后都会需大于供。我们就先贪心,认为i + 1就是我们要找的起始点(至于为什么是i + 1,因为我们需要环行一周,可以把分割点之前的所有加油站简化为一个大加油站,消耗的油量就是其和值。我们无法判断从i+2开始的和值是否能比其和值要大,若是小了,那么我们是无法穿过那个大加油站,完成环行的),以此类推,直到找到最后一个分割点+1(显然若是有解的话一定会有这么一点),也就是i + 1,返回即可。

qq_74351198的博客 765
上一篇: ArcGIS Server Linux 10.7压缩包
下一篇: Hadoop四个配置文件
IT-Billy
博客等级 码龄7年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值