​Link​

考虑从第一个加油站出发,最多能到第 y y y个加油站

有 ∑ i = 1 y g a s [ i ] < ∑ i = 1 y c o s t [ i ] \sum\limits_{i=1}^{y}gas[i]<\sum\limits_{i=1}^y cost[i] i=1∑ygas[i]<i=1∑ycost[i]

那么考虑现在从第 k ∈ [ 1 , y ] k\in[1,y] k∈[1,y]个加油站出发,能否突破第 y y y个加油站

但是显然不可能,因为有

∑ i = 1 k − 1 g a s [ i ] > = ∑ i = 1 k − 1 c o s t [ i ] \sum\limits_{i=1}^{k-1}gas[i]>=\sum\limits_{i=1}^{k-1} cost[i] i=1∑k−1gas[i]>=i=1∑k−1cost[i]

可以发现如果从第一个加油站出发到第 k k k个加油站还有油多,即使是这样也没能通过第 y y y个加油站

所以 [ 1 , y ] [1,y] [1,y]的所有起点都不可能,这样只需要考虑后面

重复这样做,复杂度是 O ( n ) O(n) O(n)的

class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
for(int i=0;i<n;i++)
{
int now = 0, j = i;
while( now>=0 )
{
now += gas[j], now -= cost[j];
j = (j+1)%n;
if( j==i && now>=0 ) return i;
}
if( j<=i ) return -1;
i = j-1;
}
return -1;
}
};