Leetcode中等:134. 加油站

【中等】力扣算法题解析LeetCode134:加油站 题目要求在环形加油站中选择一个起点,使得汽车能绕环路行驶一周。通过计算每个加油站的净收益(gas[i] - cost[i]),若总净收益非负,则存在唯一解。采用贪心算法:遍历加油站时累加当前油量,若油量为负则重置起点为下一站。最终若总油量足够则返回起点,否则返回-1。时间复杂度O(n),空间复杂度O(1)。 阅读详情

题目:加油站

  • 题号:134
  • 难度:中等
  • https://leetcode-cn.com/problems/gas-station/

在一条环路上有 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 可为起始索引。

示例 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 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

提示:

  • gas.length == n
  • cost.length == n
  • 1<=n<=1051 <= n <= 10^51<=n<=105
  • 0<=gas[i],cost[i]<=1040 <= gas[i], cost[i] <= 10^40<=gas[i],cost[i]<=104

实现

贪心算法(greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。

贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

第一种:模拟仿真

首先:只有第i站的gas[i] >= cost[i](加入汽油数 >= 消耗汽油数),才能作为起始加油站。此时剩余油数为Remaining = gas[i] - cost[i]。

其次:第i+1站的剩余油数为Remaining += gas[i+1] - cost[i+1]只有Remaining > 0才能前往下一站,否则不能前往下一站。

以此类推,若能跑完一周,则找到起始的加油站。

C# 语言

public class Solution
{
    public int CanCompleteCircuit(int[] gas, int[] cost)
    {
        for (int i = 0; i < gas.Length; i++)
        {
            if (gas[i] >= cost[i])
            {
                if (IsCan(gas,cost,i))
                {
                    return i;
                }
            }
        }
        return -1;
    }
    
    private bool IsCan(int[] gas, int[] cost,int index)
    {
        int Remaining = gas[index] - cost[index];
        for (int i = 1; i < gas.Length; i++)
        {
            int j = (index + i) % gas.Length;
            Remaining += gas[j] - cost[j];
            if (Remaining < 0)
            {
                return false;
            }                
        }
        return true;
    }   
}

第二种:连续求和法

易知当总加入汽油数大于等于总消耗油汽油数时,无论如何都有解,关键就在于找出起点。

又因为有解时答案唯一,故可将问题转化为求连续和法,若连续和小于等于0,那么此段中肯定不含可以作起点的油站,将下一个油站记为起点继续计算。

C# 语言

public class Solution
{
    public int CanCompleteCircuit(int[] gas, int[] cost)
    {
        int total = 0;
        int index = 0;
        int keeping = 0;
        for (int i = 0; i < gas.Length; i++)
        {
            int Remaining = gas[i] - cost[i];
            total += Remaining;
            if (keeping > 0)
            {
                keeping += Remaining;
            }
            else
            {
                keeping = Remaining;
                index = i;
            }
        }
        return total < 0 ? -1 : index;
    }
}

python 语言

class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        """
        :type gas: List[int]
        :type cost: List[int]
        :rtype: int
        """
        total, index, keeping = 0, 0, 0
        for i in range(len(gas)):
            remaining = gas[i] - cost[i]
            total += remaining
            if keeping > 0:
                keeping += remaining
            else:
                keeping = remaining
                index = i
        return -1 if total < 0 else index
HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码) 本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。 阅读详情

相关推荐

[RK3568][Android11.0]Vold-DiskInfo:区分u盘和硬盘

测试平台 Platform: RK3568 OS: Android 11.0 需求描述 目前系统内部设备没有对硬盘(sata/usb移动硬盘)和u盘做区分,统一显示的为usb存储设备.目前有需求要在显示上有所区分。 解决方案 如何区分移动硬盘和U盘,见Android usb设备的检测及区分(sata硬盘、优盘及移动硬盘).主要就是检测removeable值,为0:硬盘,为1:u盘 解决补丁如下 From 572cf35c07f68c5cb5defe40c536dd9ad1b4648e Mon Sep 17

weixin_39966398的博客 1897

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

leetcode的每日一题

asdfasaa的博客 1288

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 425

leetcode:134. 加油站

题目来源 leetcode:gas-station 题目描述 class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { } }; 题目解析 把这个题理解成下边的图就可以。 每个节点表示添加的油量,每条边表示消耗的油量。题目的意思就是问我们从哪个节点出发,还可以回到该节点。只能顺时针方向走。 暴力 遍历每一个加油站为起点的情况

OceanStar的博客 1196

mac搭建ios自动化环境之WebDriverAgent配置

一、WebDriverAgent 1、简单介绍: WebDriverAgent是facebook为苹果公司开发的一款自动化测试工具,github上有下载资源;另外appium安装后也会自动安装自带的WebDriverAgent;可以用自带的,也可以从github下载并替换自带的; 2、不同appium版本自带WebDriverAgent默认路径不同 1)appium 1.10.1之前版本: npm方式安装: /usr/local/lib/node_modules/appium/node_modules/a

qq_30237715的博客 2761

Vast.ai GPU服务器租用与SSH密钥连接实战指南

本文详细介绍了如何在Vast.ai平台租用GPU服务器并通过SSH密钥安全连接的全流程。从注册、选配GPU型号到SSH密钥生成与配置,再到实战中的端口转发和文件传输技巧,帮助用户高效利用云端GPU资源进行深度学习等计算密集型任务。

weixin_29574585的博客 526

leetcode(力扣) 134. 加油站 (贪心 & 两种情况,老司机逻辑题)

感觉这是一道逻辑题。经常开长途高速的司机朋友应该比较容易懂??玄学了。。。

深度不学习!!的博客 1791

ALTERA MAX10 FPGA 串口远程升级实战:从原理到烧录的避坑指南

本文详细解析了ALTERA MAX10 FPGA如何通过串口实现远程升级。文章从工程师实战经验出发,深入剖析了MAX10片内Flash的双镜像备份原理、CONFIG_SEL引脚启动机制,并重点介绍了使用On-Chip Flash IP核进行擦写操作的核心流程。同时,提供了从Quartus工程配置、RPD文件生成、串口协议设计到驱动代码编写的完整避坑指南,旨在帮助开发者稳定、高效地完成远程升级功能部署。

weixin_29197699的博客 273

【经典面试题-LeetCode134:加油站问题(Java实现)】

经典面试题:加油站问题

NorthSmile的博客 1353

从3D相机数据到三维模型:Halcon实战深度图、亮度图与点云转换全流程

本文详细解析了如何利用Halcon将3D相机采集的深度图、亮度图转换为三维点云模型的完整流程。通过实战案例分享,涵盖数据格式处理、点云生成方法(SDK接口与纯Halcon实现)、三维模型可视化优化等关键技术,帮助工程师解决工业检测中的实际难题,提升三维重建精度与效率。

weixin_42525005的博客 394

robot framework循环读取excel表操作

robot framework循环读取excel表操作 1、安装excellibrary,注意python3.7版本,需安装:robotframework-excel,robotframework-excellibrary-xwfintech 注意:网上有很多excel处理的,都是基于python2.7的,还有一些对python3以上都是修改包的方式,其实都不需要,在pip官网上有python3以上的excellibrary,名称是robotframework-excellib 2.0.0,但是该包关键字不

余墨的博客 1319

LeetCode 134. 加油站

【代码】LeetCode 134. 加油站。

qq_45972928的博客 241

YOLO11涨点优化:知识蒸馏 | 引入FGD(Focal and Global Distillation)蒸馏,让轻量学生模型汲取大模型全局感知力

文章摘要 目标检测模型YOLO11在轻量化部署中存在"全局盲区"问题,即轻量模型感受野不足导致大尺度场景下性能下降。知识蒸馏技术FGD(Focal and Global Distillation)通过双分支机制有效解决这一问题:Focal Distillation分离前景背景特征,让学生模型聚焦关键区域;Global Distillation传递像素间关系信息,弥补全局感知缺陷。实验表明,FGD可使YOLO11轻量版mAP提升2.5%以上,且不增加推理耗时。本文详细解析了FGD原理,并给出YOLO11上的实

2601_95807009的博客 226

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的博客 1624

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LeetCode第134题_加油站

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

qq_40263592的博客 1178

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

面试经典题目:LeetCode134_加油站

从公式推导到代码形成

sun_0228的博客 1148

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode(贪心)-134-加油站

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

2301_81128256的博客 1898

leetcode134:加油站(图解贪心)

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

lyh2004_08的博客 999

LeetCode134_加油站

贪心

Haolin_Liu的博客 866

【玩转贪心算法专题】134. 加油站【中等】

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]

sadsasdsdsdasda的博客 818

134. 加油站

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

mrjieke6的博客 1497

leetcode134. 加油站(java)

gas = [1,2,3,4,5], cost = [3,4,5,1,2] 这两个数组,我们可以对应位置相减。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]输入: gas = [2,3,4], cost = [3,4,3]开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。

SP_1024的博客 898

Leetcode 134. 加油站(贪心)

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

qq_74351198的博客 763

【力扣134】加油站

本文解决加油站环形路线问题,通过贪心算法高效确定唯一可行起点。核心观察包括:若总油量不足则无解;若足够则必有唯一解;若从A无法到达B,则A到B间任何点都不能作为起点。算法维护全局和当前油量,遍历时跳过无效起点,时间复杂度O(n),空间O(1)。通过排除法保证正确性,比暴力解法更优,是面试高频推荐解法。

27届Java后端炒粉练习生,AICoding中........ 714

【LeetCode: 134. 加油站 | 贪心算法】

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

Coder_ljw的博客 1280

#day10 力扣每日一题134.加油站

力扣每日一题

m0_73221020的博客 1297
上一篇: Leetcode简单:136. 只出现一次的数字
下一篇: Leetcode简单:1. 两数之和
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程小助手_Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值