【LeetCode练习题】Gas Station

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, otherwise return -1.

Note:
The solution is guaranteed to be unique.

 

题目意思:

有N个加油站,gas[i]表示第i个加油站有多少汽油,cost[i]表示从第i个加油站去往第i+1个加油站要消耗多少汽油。开始的时候汽车里面没有汽油。

返回某个(从0开始的)加油站,从这个加油站出发可以环绕N个加油站一周一直都有油。如果找不到,返回-1。

 

解题思路:

假设edge[i] = gas[i] - cost[i]。那么若edge[0] > 0,表示从0号加油站可以到达1号加油站。

显然,如果edge[0]+edge[1]+edge[2]+edge[3]+edge[4]+edge[5]+edge[6]+edge[7]+edge[8]+edge[9] < 0,应该返回-1。

我们考虑这样一种情况,从0号出发,0号可以到1号,然后到2号,然后到3号,当到达3号的时候我们发现0,1,2,3号加油站目前为止的gas[0],gas[1],gas[2],gas[3]的总和开始比cost[0],cost[1],cost[2],cost[3]小了,即edge[0]+edge[1]+edge[2]+edge[3] < 0。此时的油量将无法支撑我们开往4号加油站。

这样的话,可以得出0号是不能作为起点的结论。

那么1号可以作为起点吗?

显然也不能!

因为edge[0]+edge[1]+edge[2]+edge[3] < 0,而且我们已经知道了edge[0] > 0,那么很自然的可以知道edge[1]+edge[2]+edge[3] < 0必定成立,这样从1号开始出发的话,结局也一定是在3号加油站这里悲剧。

那么2号,3号呢?一样也不能作为起点了。

所以,我们应该直接考虑3号的下一个加油站4号作为新的起点,假设一共有10个加油站(0号到9号),当以4号为新起点的时候,如果一直遍历到9号,都没有出现问题,即

edge[4]+edge[5]+edge[6]+edge[7]+edge[8]+edge[9] > 0,那么4号就是我们返回的结果了。

 

代码如下:

class Solution {

public:

    int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {

        int left=0;

        int totalLeft = 0;

        int start = 0;

        int len = gas.size();

        for(int i = 0; i < len; i++){

            left += gas[i] - cost[i];

            totalLeft += gas[i] - cost[i];

            if(left < 0){

                start = i + 1;

                left = 0;

            }

        }

        return totalLeft>=0? start:-1;

    }

};

 

 

你可能感兴趣的:(LeetCode)