题目
There are N gas stations along a circular route, where the amount of gas at station i is gas[i].
You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.
Return the starting gas station’s index if you can travel around the circuit once in the clockwise direction, otherwise return -1.
Note:
If there exists a solution, it is guaranteed to be unique.
Both input arrays are non-empty and have the same length.
Each element in the input arrays is a non-negative integer.
Example 1:
Input:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
Output: 3
Explanation:
Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 4. Your tank = 4 - 1 + 5 = 8
Travel to station 0. Your tank = 8 - 2 + 1 = 7
Travel to station 1. Your tank = 7 - 3 + 2 = 6
Travel to station 2. Your tank = 6 - 4 + 3 = 5
Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.
Therefore, return 3 as the starting index.
Example 2:
Input:
gas = [2,3,4]
cost = [3,4,3]
Output: -1
Explanation:
You can’t start at station 0 or 1, as there is not enough gas to travel to the next station.
Let’s start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 0. Your tank = 4 - 3 + 2 = 3
Travel to station 1. Your tank = 3 - 3 + 3 = 3
You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.
Therefore, you can’t travel around the circuit once no matter where you start.
思路
首先判断是否可能,很容易想到是判断总油量和总花费的大小,如果前者大于等于后者那么可以,此时需要找到起点。
看example1,此时的差值为
[
−
2
,
−
2
,
−
2
,
3
,
3
]
[-2,-2,-2,3,3]
[−2,−2,−2,3,3],然后当前累计差值为
[
−
2
,
−
4
,
−
6
,
−
3
,
0
]
[-2,-4,-6,-3,0]
[−2,−4,−6,−3,0],我们发现从
i
n
d
e
x
=
3
index=3
index=3开始正好是在当前差值最小-6的后一个位置开始,从3开始的当前累计差值为
[
3
,
6
,
4
,
2
,
0
]
[3,6,4,2,0]
[3,6,4,2,0].
因为有用的信息只有gas和cost数列的差值,以下只讨论差值。
再来看别的例子,例如差值
[
−
1
,
4
,
−
5
,
1
,
−
3
,
6
]
[-1,4,-5,1,-3,6]
[−1,4,−5,1,−3,6],显然答案应该是从正数开始的,有以下几种情况
从
i
n
d
e
x
=
1
index=1
index=1开始,累计差值为
[
4
,
−
1
,
0
,
−
3
,
3
,
2
]
[4,-1,0,-3,3,2]
[4,−1,0,−3,3,2];
从
i
n
d
e
x
=
3
index=3
index=3开始,累计差值为
[
1
,
−
2
,
4
,
3
,
7
,
2
]
[1,-2,4,3,7,2]
[1,−2,4,3,7,2];
从
i
n
d
e
x
=
5
index=5
index=5开始,累计差值为
[
6
,
5
,
9
,
4
,
5
,
2
]
[6,5,9,4,5,2]
[6,5,9,4,5,2]
出现负数则说明不可行,所以唯一可行的是
i
n
d
e
x
=
5
index=5
index=5,通过这个例子我们也可以发现,不论如何旋转这个数列(从不同的位置开始),从累计差值最小的下一项开始一定是可行的,因为数列整体是可行的,所以结束的时候累计差值一定非负,从最小的开始可以直观上理解成先实现最大跨度的增长再去减少,期间也不会减小至小于0。
考虑用pSum记录累计差值,minSum记录当前最小累计差值,index为取到的位置+1,代码如下。
代码
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int index = 0;
int pSum = 0, minSum = 0;
for (int i = 0; i < gas.length; i++) {
pSum += gas[i] - cost[i];
if (pSum < minSum) {
index = i + 1;
minSum = pSum;
}
}
if (pSum < 0) return -1;
return index;
}
}