Discription:
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.
Solution:
/*
diff[i] = gas[i] - cost[i]
求循环数组的最大子序列问题
*/
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int MAX = gas[0] - cost[0], MIN = gas[0] - cost[0];
int max = gas[0] - cost[0], min = gas[0] - cost[0];
int stMAX = 0, stmax = 0, endMIN = 0;
int total = gas[0] - cost[0], diff = 0;
for (int i = 1; i < gas.size(); i++){
diff = gas[i] - cost[i];
total += diff;
if (max <= 0){
max = diff;
stmax = i;
}
else max += diff;
if (max > MAX){
MAX = max;
stMAX = stmax;
}
if (min >= 0)
min = diff;
else
min += diff;
if (min < MIN){
MIN = min;
endMIN = i;
}
}
return total < 0 ? -1 : (MAX >= (total - MIN) ? stMAX : (endMIN + 1) % gas.size());
}
/*
假设A,B,C,D,E
若A可以到B和C,不能到D,则B,C都不能到D
*/
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
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;
}
GitHub-Leetcode:
https://github.com/wenwu313/LeetCode