news 2026/6/10 18:35:07

LeetCode 134. 加油站(O(n)时间+O(1)空间最优解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 134. 加油站(O(n)时间+O(1)空间最优解)

✨ 本文针对 LeetCode 中等难度题目 134. 加油站,提供一种时间复杂度 O(n)、空间复杂度 O(1) 的最优解法,结合具体思路推导和代码实现,帮你快速吃透这道题。

一、题目描述

在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。

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

给定两个整数数组gascost,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回-1。如果存在解,则保证它是唯一的。

二、解题思路推导

核心思想

利用「贪心策略」,通过一次遍历找到合法起点,无需重复模拟。核心逻辑是:如果从起点 i 到 j 时汽油耗尽,那么 i 到 j 之间的所有站点都不能作为起点,直接将起点更新为 j+1

变量定义

  • i:标记当前候选起点,初始设为最后一个站点(n-1),反向推导更高效。

  • j:标记当前行驶到的站点,从起点 i 开始向前移动(循环遍历)。

  • s:当前油箱剩余汽油量,初始为 0。

  • cnt:当前已行驶过的加油站数量,用于判断是否完成一周循环。

执行步骤

  1. 初始化:i = n-1j = n-1s = 0cnt = 0

  2. 开始行驶:移动j(循环左移,即 j = (j-1) % n,也可正向遍历,此处反向更贴合初始起点设置),并更新剩余汽油s += gas[j] - cost[j](表示从 j 站开到 j+1 站的汽油变化)。

  3. 判断剩余汽油:若s < 0,说明当前起点i无法支撑到j站,需将起点i循环左移(i = (i-1) % n),同时将s加上gas[i] - cost[i](补充从新起点 i 到原起点 i+1 的汽油量),直至s >= 0

  4. 计数判断:每行驶一个站点,cnt += 1。当cnt == n时,说明已完成一周循环,停止遍历。

  5. 结果判断:若此时s >= 0,则i是合法起点,返回i;否则返回 -1(无合法起点)。

逻辑验证

为什么这样能找到合法起点?假设从 i 到 j 时 s 为负,说明 i 到 j 之间的任何站点 k 都无法作为起点——因为从 k 出发到 j 时,汽油量只会比从 i 出发到 j 时更少(i 到 k 之间的汽油消耗已导致亏损)。因此直接跳过中间站点,将起点更新为 j+1,减少无效遍历。

三、代码实现(Java)

Java 实现

class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int n = gas.length; int i = n - 1, j = n - 1; int cnt = 0, s = 0; while (cnt < n) { s += gas[j] - cost[j]; ++cnt; j = (j + 1) % n; while (s < 0 && cnt < n) { --i; s += gas[i] - cost[i]; ++cnt; } } return s < 0 ? -1 : i; } }

四、复杂度分析

  • 时间复杂度 O(n):每个站点最多被访问两次(一次被 j 遍历,一次被 i 遍历),整体遍历次数为 O(n),无嵌套重复遍历。

  • 空间复杂度 O(1):仅使用 4 个额外变量(i、j、s、cnt),不依赖额外数组或数据结构,空间开销恒定。

五、测试用例验证

示例 1 验证

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

执行过程:

初始 i=4, j=4, s=0, cnt=0。

j=4:s += 5-2=3 → s=3,cnt=1,j=3。s≥0,无需移动i。

j=3:s +=4-1=3 → s=6,cnt=2,j=2。

j=2:s +=3-5=-2 → s=4,cnt=3,j=1。

j=1:s +=2-4=-2 → s=2,cnt=4,j=0。

j=0:s +=1-3=-2 → s=0,cnt=5(等于n=5)。循环结束,s≥0,返回i=3(过程中i未移动,最终i=3)。

示例 2 验证

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

执行结束后 cnt=3,但 s= (4-3)+(3-4)+(2-3) = 1-1-1 = -1 <0,返回-1。

六、总结

本题的关键是利用贪心策略跳过无效起点,将时间复杂度从 O(n²) 优化到 O(n)。核心逻辑是「无效起点区间内的所有站点均无效」,通过反向推导(初始起点设为 n-1)简化遍历过程,同时保证空间复杂度最优。

这种思路不仅适用于本题,还可迁移到类似「寻找循环有效起点」的贪心问题中,建议结合代码多模拟几遍执行过程,加深对贪心逻辑的理解。

💡 如果你有其他解法或疑问,欢迎在评论区留言交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:35:00

字节序及IP地址转换

文章目录字节序检测主机字节序字节序转换函数函数原型示例IP地址字符串与二进制转换传统转换函数&#xff08;IPv4专用&#xff09;现代转换函数&#xff08;支持IPv4/IPv6&#xff09;线程安全的转换字节序 定义&#xff1a;多字节数据在内存中存储或网络传输时各字节的顺序两…

作者头像 李华
网站建设 2026/6/10 11:43:47

【AI经典论文解读】《High-Resolution Image Synthesis with Latent Diffusion Models(基于潜在扩散模型的高分辨率图像合成)》论文深度解读

从像素炼狱到“潜空间”捷径&#xff1a;LDM如何引爆AI绘画革命并实现算力民主化 感知压缩与语义生成的完美解耦 在2021年前后&#xff0c;扩散模型虽然已经证明了其在图像生成质量上能超越GAN&#xff0c;但“昂贵”是它撕不掉的标签。由于需要在高维度的像素空间&#xff0…

作者头像 李华
网站建设 2026/6/10 11:44:32

深度测评专科生必用8款一键生成论文工具:开题报告文献综述全攻略

深度测评专科生必用8款一键生成论文工具&#xff1a;开题报告文献综述全攻略 为什么需要这份专科生专属论文工具测评&#xff1f; 随着学术写作需求的不断增长&#xff0c;越来越多的专科生开始依赖AI写作工具来提升论文撰写效率。然而&#xff0c;面对市场上琳琅满目的工具&am…

作者头像 李华
网站建设 2026/6/10 11:40:35

学术写作的第一步不再复杂,AI工具助你高效完善开题报告模板

AI开题报告工具对比速览 工具名称 核心功能 生成速度 适用场景 独特优势 AIbiye 全流程论文辅助 3-5分钟 从开题到定稿 深度学术逻辑构建 AIcheck 精准开题生成 2-3分钟 快速产出初稿 国内院校模板库 AskPaper 文献综述辅助 实时响应 研究现状分析 海量文献…

作者头像 李华
网站建设 2026/6/10 15:37:24

借助AI工具的强大功能,轻松生成一份高质量的开题报告模板

AI开题报告工具对比速览 工具名称 核心功能 生成速度 适用场景 独特优势 AIbiye 全流程论文辅助 3-5分钟 从开题到定稿 深度学术逻辑构建 AIcheck 精准开题生成 2-3分钟 快速产出初稿 国内院校模板库 AskPaper 文献综述辅助 实时响应 研究现状分析 海量文献…

作者头像 李华