class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int min = Integer.MAX_VALUE;
int start = 0;
int total = 0;
for(int i = 0 ; i < gas.length ; i++){
total += gas[i] - cost[i];
if(total < min){
//如果可以行驶一周, 出发点一定是最低点的前一个
//找到最低点
start = i;
min = total;
}
}
//剩余的总数如果小于0肯定到达不了
if(total < 0) return -1;
return start == gas.length-1 ? 0 : start + 1;
}
}
class Solution2 {
public int canCompleteCircuit(int[] gas, int[] cost) {
//从每个加油站开始尝试
for(int i = 0 ; i < gas.length ; i++){
int j = i;
int sum = gas[j] - cost[j];
while(sum >= 0){
j = (j + 1) % gas.length;
//可以到达下一个加油站
sum += gas[j] - cost[j];
//j转了一圈回到起点i , 返回j
if(j == i){
return j;
}
}
//如果j转到i前面 , 到不了i了
//说明i后面的加油站也都回不到i
//之前也没有正确结果返回
//所以返回-1
if(j < i) return -1;
//j是能到达的最远加油站
//如果i到不了j , 那么i和j之间的点都到不了j
//下次循环i++ , 从j + 1开始看
i = j;
}
return -1;
}
}