class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int min = Integer.MAX_VALUE;
int cursum = 0;
for(int i = 0;i < gas.length;i++){
int rest = gas[i] - cost[i];
cursum += rest;
if(min > cursum) min = cursum;
}
//情况1
if(cursum < 0) return -1;
//情况2
if(min >= 0) return 0;
//情况3
for(int i = gas.length - 1; i >= 0;i--){
int rest = gas[i] - cost[i];
min += rest;
if(min >= 0) return i;
}
return -1;
}
}
直接从全局开始考虑,记录从0开始的cursum累加。记录最小值
情况1:cursum < 0
油不够,不够跑完一圈,返回-1
情况2:min>=0
说明从0开始跑始终够跑完一圈
情况3:min<0
从0开始跑遇到的cursum的最小值是负数,从最后开始向前累加,能够填平这个最小值则说明从那个点开始绕一圈走到最小值处正好可以过这个站点(因为只存在唯一解,所以不存在这个点继续向前扫可以找到更大的正数,如果可以就不是唯一解了)
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int cursum = 0;
int totalsum = 0;
int res = 0;
for(int i = 0;i < gas.length;i++){
int rest = gas[i] - cost[i];
cursum += rest;
totalsum += rest;
if(cursum < 0){
res = i + 1;
cursum = 0;
}
}
//情况1
if(totalsum < 0) return -1;
//情况2
return res;
}
}
从0开始累加,如果遇到cursum < 0,则从0到i这里所有的站点都不可能作为起点通过i,因为0是正数起点,从i+1开始再进行累加,直到条件成立。