暴力解法:从每个节点开始模拟,找到那个可以完成全程的节点,返回
优化:首先开始节点必定是能到下一个节点的;一个节点无法达成目标的话一定终止于一个不能出发的节点,可以理解为该节点的 “亏本” 是前面所有节点一起的 “收益” 都无法弥补的,所以下一个要开始模拟的节点可以变成是终止节点的下一个节点,而不是开始节点的下一个节点
如此得到的解是 2ms
题解启发:所有加油站的汽油总量大于路程消耗总量,则一定有解。 每次模拟不用以回到原点为目标,只要到到最后一个节点就够了
自己的(1ms)
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int l = cost.length,t = 0,ans = 0,q = 0;
for(int i = 0; i < l; i++){
t += gas[i] - cost[i];
if(t < 0){
q += t;
t = 0;
ans = i + 1;
continue;
}
}
if(t + q < 0)
return -1;
else
return ans;
}
}