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.
Example
Analysis:
This problem can be transformed to maximum subarray. If there is a station from where we can go through all the stations, and given the solution is unique, it must be the starting of the maximum subarray.
Given
4
gas stations with gas[i]=[1,1,3,1]
, and the cost[i]=[2,2,1,1]
. The starting gas station's index is 2
.class Solution { public: int canCompleteCircuit(vector<int> &gas, vector<int> &cost) { int n = gas.size(); if(0 == n) return -1; int lastMax = gas[0]-cost[0]; int totalMax = lastMax; int start = 0, maxStart = 0; for(int i=1;i<2*n-1;i++) { int j = i % n; int suf = gas[j] - cost[j]; if(lastMax < 0) { if(i>=n) break; lastMax = suf; start = i; } else lastMax += suf; if(lastMax > totalMax) { totalMax = lastMax; maxStart = start; } } int sum = 0; for(int i=maxStart;i<n+maxStart;i++) { int j = i%n; sum += gas[j]-cost[j]; if(sum < 0) return -1; } return maxStart; } };