There are N gas stations along a circular route, where the amount of gas at station i isgas[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.
Notice
The solution is guaranteed to be unique.
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
.
O(n) time and O(1) extra space
思路是如果所有的和大于0的话,肯定有一段的和大于0, 找到那一段就行了。如果负的中间有正的一小段, 不用担心后面那段负的肯定会把正的抵消掉。所以找到的那段正的就是最大的那段。
class Solution {
public:
/**
* @param gas: a vector of integers
* @param cost: a vector of integers
* @return: an integer
*/
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
// write your code here
if(gas.size() == 0 || cost.size() == 0 || gas.size() != cost.size()) return -1;
int total = 0, sum = 0, start = 0;
for(int i = 0; i < gas.size(); ++i){
total += (gas[i] - cost[i]);
if(sum < 0){ //发现油箱空了,从下一个站点尝试
sum = (gas[i] - cost[i]);
start = i;
}else
sum += (gas[i] - cost[i]);
}
return total < 0 ? -1 : start; //用total判断start 是否是满足要求的解
}
};