加油站
中英题面
在一条环路上有N个加油站,其中第i个加油站有汽油gas[i]
升。
There areNgas stations along a circular route, where the amount of gas at stationiisgas[i]
.
你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]
升。你从其中的一个加油站出发,开始时油箱为空。
You have a car with an unlimited gas tank and it costscost[i]
of gas to travel from stationito its next station (i+1). You begin the journey with an empty tank at one of the gas stations.
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
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 asolution, 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.
示例1:
输入: gas = [1,2,3,4,5] cost = [3,4,5,1,2] 输出: 3 解释: 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 因此,3 可为起始索引。
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.
示例 2:
输入: gas = [2,3,4] cost = [3,4,3] 输出: -1 解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。 我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油 开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油 开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油 你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。 因此,无论怎样,你都不可能绕环路行驶一周。
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. <br /><br /><br /><br />
算法
设f[i] = gas[i] – cost[i]。
无解当且仅当sum{f[i]} < 0。
通过队列维护从每个加油站出发的f[i]的前缀和s[i],当s[i]恒为0时,则i为一个可行的起点。
时间复杂度:
O(N)
空间复杂度:
O(1)
代码
1 class Solution: 2 def canCompleteCircuit(self, gas, cost): 3 """ 4 :type gas: List[int] 5 :type cost: List[int] 6 :rtype: int 7 """ 8 n = len(gas) 9 for i in range(n): 10 gas[i] -= cost[i] 11 if (sum(gas) < 0): 12 return -1 13 i = j = now = 0 14 while (True): 15 now += gas[i] 16 i = (i + 1) % n 17 if (i == j): 18 return j 19 while (now < 0): 20 now -= gas[j] 21 j = (j + 1) % n