Leetcode 134-加油站

本文介绍了一种解决环路加油问题的方法,通过分析加油站的汽油供给与消耗情况,提出了一种有效的贪心算法来确定能否完成环路行驶,并找到了合适的起点加油站。

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

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

给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
在这里插入图片描述
在这里插入图片描述

题解

题解转载自angela-x

法一 贪心法

如果选择站点i作为起点「恰好」无法走到站点j,那么i和j中间的任意站点k都不可能作为起点。
● 为什么会有上面这个结论呢?我们举个具体的例子来看,假设left += gas[i]-cost[i]
● 从起点站 a 出发,必须 gas[a] - cost[a] >= 0 才能到 b 站。假设去到 c 站加完油发现去不了 d 站,只是说明 a 站不是合格起点吗?
● 到不了 d 站就说明: (gas[a] - cost[a] )+ (gas[b] - cost[b])+ (gas[c] - cost[c])<0,也就是说left(a)+left(b)+left©<0,而已经left(a)>=0,所以left(b)+left©<0,b 站不能作为起点,因为去不了 d
● 如果能来到c站,肯定到过 b 站,所以有: left(a)+left(b)>=0,又因为:left(a)+left(b)+left©<0,所以有:left©<0

//首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的
//i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int totalSum=0;
        int curSum=0;
        int start=0;
        for(int i=0;i<gas.length;i++){
            //记录总油量
            totalSum+=gas[i]-cost[i];
            //记录从start坐标开始的油量
            curSum+=gas[i]-cost[i];
            //从start坐标到i坐标区间的油量<0,start坐标更新为i+1,curSum从start开始重新累计
            if(curSum<0){
                start=i+1;
                curSum=0;
            }
        }
        //判断start<gas.length是为了避免start=i+1越界
        if(totalSum>=0&&start<gas.length) return start;
        return -1;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值