Problem: 134. 加油站
复杂度
⏰ 时间复杂度: O ( n ) O(n) O(n)
🌎 空间复杂度: O ( 1 ) O(1) O(1)
💖 贪心
👨🏫 参考题解
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
for (int i = 0; i < n; i++) {
int remain = gas[i];
int j = i;
while (remain - cost[j] >= 0) {
//减去花费的加上新的点的补给
remain = remain - cost[j] + gas[(j + 1) % n];
j = (j + 1) % n;
if (j == i) {
return i;
}
}
// 绕回到前面的点了,走到这说明前面的点是无解的
// 所以 j < i 也无解
if(j < i)
return -1;
// i 直接跳到 j,外层 for 循环执行 i++,相当于从 j + 1 开始考虑
i = j;
}
return -1;
}
}
💖 极简版
👨🏫 参考
其实很简单,只要总油量大于等于总耗油量就肯定能跑完一圈,换句话说,油的剩余量如果大于等于0就肯定能跑完一圈,这么一想这个问题就简单了,那么总耗油量如果小于0,直接返回-1
public int canCompleteCircuit2(int[] gas, int[] cost) {
int totalNum = 0;
int curNum = 0;
int idx = 0;
for (int i = 0; i < gas.length; i++) {
curNum += gas[i] - cost[i];
totalNum += gas[i] - cost[i];
if (curNum < 0) {
idx = (i+1) % gas.length;
curNum = 0;
}
}
if(totalNum < 0) return -1;
return idx;
}