思路:
遍历数组,遇到gas[i] >= cost[i] 时,尝试以i节点作为起始点,sumGas记录总油量,到达一个站点,加上gas[i]油量,并减去将要耗费的油量cost[i], 如果sumGas小于0,说明到达不了下一站。
public static int canCompleteCircuit(int[] gas, int[] cost) {
// 记录遍历的节点个数
int count = 0;
int len = gas.length;
for (int i = 0;;i++) {
// 当遍历长度为一个数组长度,则停止
if (count == len) {
break;
}
count++;
// 遍历中以gas[i] >= cost[i]的节点作为起点
i = i % len;
if (gas[i] >= cost[i]) {
// 如果i节点开始能走完一圈,则返回i
if (canCircuitHelper(gas, cost, i)) {
return i;
}
}
}
return -1;
}
private static boolean canCircuitHelper(int[] gas, int[] cost, int i) {
int sumGas = 0;
int count = 0;
int len = gas.length;
for (int j = i; ;j++) {
if (count == len) {
break;
}
count++;
j = j % len;
// 当前可以加油量 - 接下来要耗费的油量
sumGas += gas[j] - cost[j];
// 小于0,说明不能到达下一站
if (sumGas < 0) {
return false;
}
}
return true;
}