134. Gas Station

There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

Return the starting gas station's index if you can travel around the circuit once in the clockwise direction, otherwise return -1.

Note:

  • If there exists a solution, it is guaranteed to be unique.
  • Both input arrays are non-empty and have the same length.
  • Each element in the input arrays is a non-negative integer.

Example 1:

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

Output: 3

Explanation:
Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 4. Your tank = 4 - 1 + 5 = 8
Travel to station 0. Your tank = 8 - 2 + 1 = 7
Travel to station 1. Your tank = 7 - 3 + 2 = 6
Travel to station 2. Your tank = 6 - 4 + 3 = 5
Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.
Therefore, return 3 as the starting index.

Example 2:

Input: 
gas  = [2,3,4]
cost = [3,4,3]

Output: -1

Explanation:
You can't start at station 0 or 1, as there is not enough gas to travel to the next station.
Let's start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 0. Your tank = 4 - 3 + 2 = 3
Travel to station 1. Your tank = 3 - 3 + 3 = 3
You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.
Therefore, you can't travel around the circuit once no matter where you start.

个人理解如下:

class Solution {
    
    //假设一
    // If car starts at A and can not reach B.(B is the first station that A can not reach.)
    // then start from any station between A and B, we can not reach B.
    //证明:对于AB中的任意一个站C:由于A可以到达C,从A出发到达C时,tank>=0,接着从C往B走,无法成功到达B。
    //那么如果直接从C出发,tank=0,更不可能到达B了。所以AB中的任意一站C是不可能作为起点的
    
    //假设二
    // If the total number of gas is bigger than the total number of cost. There must be no solution!
    //证明:从任何一个gas station绕行一圈后,(gas-cost)求和是一样的。如果求和小于0,至少说明无法到达gas station 0(当然,也可能早就没油停车了),即无法完成环路
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int sumGas = 0;
        int sumCost = 0;
        int start = 0;//完成环路的起点位置
        int tank = 0;//车油箱中的油
        for (int i = 0; i < gas.length; i++) {
            sumGas += gas[i];
            sumCost += cost[i];
            tank += gas[i] - cost[i];//每次从i站到i+1站,油箱油量增加 gas[i]-cost[i]
            if (tank < 0) {//油不够用,说明从start到不了i+1站(注意,这是start出发,第一次到达不了的站)
                //此时,start到不了i+1站, start+1,start+2,...i站同样到不了i站。所以就将start,start+1,start+2,....i站都排除了。
                //所以,考虑新的可能的起点start=i+1,同时清空油箱。
                start = i + 1;
                tank = 0;
            }
        }
        if(sumGas < sumCost) {//gas station的总油量小于总cost
            return -1;
        } 
        
        //题目中说了,解是唯一的。下面证明start是可行解:
        //首先: 从start到第0站是可行的(上面的for循环判断了)。此时tank = sum1, 且sum1>0
        //其次: 从0站出发到达start站是不行的,从0站出发到达start站时tank = sum2, 且sum2<0
        //而由于sumGas>=sumCost,所以sum1+sum2>=0,即sum1-|sum2|>=0,也就证明了:
        //从start站出发,到达最后一站(此时tank=sum1),然后再继续从0站到达start站是可行的。
        //那么当在0站,tank=sum1时0,从0站到达start的过程中,有没有可能欠油呢?不可能!
        //0站tank=sum1, 假如在某站i(i=1,2,..start-1)时最后一次欠油,由于最终在到达start站后tank>=0,那么说明在i站出发必能到达start站,这与假设一矛盾。所以不存在欠油的时候
        //所以start是可行解
        return start;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用c++解决pipeline system consists of N transfer station, some of which are connected by pipelines. For each of M pipelines the numbers of stations A[i] and B[i], which are connected by this pipeline, and its profitability C[i] are known. A profitability of a pipeline is an amount of dollars, which will be daily yielded in taxes by transferring the gas through this pipeline. Each two stations are connected by not more than one pipeline. The system was built by Soviet engineers, who knew exactly, that the gas was transferred from Ukrainian gas fields to Siberia and not the reverse. That is why the pipelines are unidirectional, i.e. each pipeline allows gas transfer from the station number A[i] to the station number B[i] only. More over, if it is possible to transfer the gas from the station X to the station Y (perhaps, through some intermediate stations), then the reverse transfer from Y to X is impossible. It is known that the gas arrives to the starting station number S and should be dispatched to the buyers on the final station number F. The President ordered the Government to find a route (i.e. a linear sequence of stations which are connected by pipelines) to transfer the gas from the starting to the final station. A profitability of this route should be maximal. A profitability of a route is a total profitability of its pipelines. Unfortunately, the President did not consider that some pipelines ceased to exist long ago, and, as a result, the gas transfer between the starting and the final stations may appear to be impossible... Input The first line contains the integer numbers N (2 ≤ N ≤ 500) and M (0 ≤ M ≤ 124750). Each of the next M lines contains the integer numbers A[i], B[i] (1 ≤ A[i], B[i] ≤ N) and C[i] (1 ≤ C[i] ≤ 10000) for the corresponding pipeline. The last line contains the integer numbers S and F (1 ≤ S, F ≤ N; S ≠ F). Output If the desired route exists, you should output its profitability. Otherwise you should output "No solution".
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值