在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
我的解法:首先认为所有gas[i] > cost[i]的加油站i为可能的开始位置,然后依次从所有可能的开始位置出发行驶,判断汽车在当前汽油站i的剩余汽油量car是否大于或等于cost[i],若是,则说明汽车可以继续行驶到汽油站i+1,此时将汽车的剩余汽油量更新为car - cost[i] + gas[i+1],同时将路程dist + 1。循环判断汽车是否能够行驶到下一个加油站,若dist==N,说明汽车已经行驶了一周,返回汽车的出发位置;若汽车在行驶途中无法继续行驶到下一个加油站,则重新开始判断下一个开始位置,若汽车从所有开始位置出发都不能行驶一周,则返回-1。
时间复杂度:O(n2),空间复杂度:O(n)
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int len = gas.length;
/*计算所有可能的开始位置*/
List<Integer> start = new LinkedList<>();
for (int i = 0; i < len; i++) {
if (gas[i] - cost[i] >= 0) {
start.add(i);
}
}
for (int currentStart : start) {
int t = currentStart, car = gas[currentStart], dist = 0;
/*当前汽油可以使汽车到达下一站*/
while (car >= cost[t]) {
car = car - cost[t] + gas[(t+1)%len];
t = (t + 1) % len;
dist += 1;
/*当汽车已经行驶了一周*/
if (dist == len) {
return currentStart;
}
}
}
return -1;
}
}