假设[i,j],从i出发,sum(gas[i]-cost[i],...gas[j]-cost[j]) < 0 那么选择j+1作为下一个尝试点,而不是[i+1,j]
证明:k >= i+1 && k <= j
假设把k作为出发点,那么sum(gas[k]-cost[k],...,gas[j]-cost[j]) >= 0,由于sum(gas[i]-cost[i],...gas[j]-cost[j]) < 0
那么sum(gas[i]-cost[i],...,gas[k-1]-cost[k-1]) < 0,这和 sum(gas[i]-cost[i],...,gas[k-1]-cost[k-1]) > 0 矛盾
得证.
class Solution {
public:
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int sum = 0;
int total = 0;
int start = 0;
int n = gas.size();
for(int i = 0;i < n;i++){
sum += gas[i] - cost[i]j;
total += gas[i] - cost[i];
if(sum < 0){
start = (i + 1)%n;
sum = 0;
}
}
return total >= 0 ? start:-1;
}
};