Powered by:NEFU AB-IN
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
假设i为起点,且i最多不能走到j,结论:[i, j]之前任意起点也 不能走到j
证明:k是可以走到的,所以left[k] >= 0(即从左边走过来还剩下有油)。 如果把k当作起点即left[k]=0,那么还是走不到j,所以下一次枚举起点,可以直接跳过[i- j],O(n)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
for (int i = 0, j; i < n; ) { // 枚举起点
int left = 0;
for (j = 0; j < n; j ++ ) {
int k = (i + j) % n;
left += gas[k] - cost[k];
if (left < 0) break;
}
if (j == n) return i;
i = i + j + 1;
}
return -1;
}
};