首页 > 代码库 > LeetCode: Gas Station

LeetCode: Gas Station

LeetCode: 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.

地址:https://oj.leetcode.com/problems/gas-station/

算法:一个简单粗暴的方法是,从第0个station开始试,看其是否可以绕一圈回到起点,这样的时间复杂度是$\O(n^2)$,如果用这种方法那么肯定是会超时的(当时我也是用这个方法,下面这个巧妙的方法也是参考了网上的答案)。那么,下面我们介绍一种线性时间复杂度的算法,这个算法是对上面一种方法的改进。这个方法最核心的思想是基于如下的事实:假如从第0个station可以到达第$j=1,2,\cdots,i-1$个station,但无法到达第i个station的话,那么从第$j=1,2,\cdots,i-1$个station出发也肯定无法到达第i个station。原因很简单,假如可以从第j个station到达第i个station,那么我们可以先从第0个到达第j个,然后在从第j个到达第i个,也就是说我们可以从第0个到达第i个,故这个假设是不成立的。这样的话,当我们判断从第0个station无法到达第i个时,可以不用回过头从第1个station判断,我们可以直接继续从第i+1个station开始判断。由于题目说至少会存在一个解,也就是我们不需要去判断不存在解的情况,所以只要循环一遍就足够了。代码:

 1 class Solution { 2 public: 3     int canCompleteCircuit(vector<int> &gas, vector<int> &cost) { 4         int n = gas.size(); 5         int sum_gas = 0, sum_cost = 0; 6         for(int i = 0; i != n; ++i){ 7             sum_gas += gas[i]; 8             sum_cost += cost[i]; 9         }10        if (sum_cost > sum_gas){11            return -1;12        }13        sum_gas = 0;14        sum_cost = 0;15        int start = 0;16        for(int i = 0; i != n; ++i){17            sum_gas += gas[i];18            sum_cost += cost[i];19            if(sum_gas >= sum_cost){20                continue;21            }else{22                start = (i + 1) % n;23                sum_gas = 0;24                sum_cost = 0;25            }26        }27        return start;28     }29 };

 

LeetCode: Gas Station