题目来源:
https://leetcode.com/problems/gas-station/description/
题目描述:
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.
题意分析:
有一个加油站序列,排成环形,一辆汽车从某个加油站开始,顺时针(沿数组下标增长方向)逐个到达每个加油站,gas[x] 为加油站x的汽油,cost[x] 为从加油站x到下一个加油站消耗的汽油。如果存在一个加油站,从这个加油站出发,沿顺时针行进最终可以回到原点,那么返回这个加油站序号;如果从任意一个加油站开始都无法回到原点,则返回-1。(题目表示:只有唯一的一个加油站可以回到原点,也就是只有唯一解)
解题思路:
- 显然,如果加油站汽油总量小于路程消耗的汽油总量,那么不可能存在一个起点加油站,使汽车可以返回原点。所以算法首先判断加油站汽油总量是否小于路程消耗的汽油总量,如果是,则无解,算法结束。
- 如果加油站汽油总量不小于路程消耗的汽油总量,那么一定存在一个起点加油站,使汽车可以返回原点,从下面的证明我们还可以找到起点是哪一个。
- 证明:假设汽车汽油量为零甚至是负数依然可以行驶,且总共有n个加油站,假设从第一个加油站出发(数组下标为0),我们知道,当通过最后一个加油站(数组下标为n-1)到达原点时(0),汽车剩余的油量gas一定是大于0的(gas >= 0)。我们称这个过程中到达一个加油站时汽油量gas最少的时刻为最艰难的时刻,那么我们就选择最艰难的时刻作为起点,那么容易知道,往后将没有任何节点可以使gas小于0。
- 我们还可以画图证明,横轴是加油站编号,纵轴是汽车到达下一个加油站的时刻剩余的汽油量。具体可以看我在LeetCode讨论中提交的答案。(O(n) time and O(1) space python solution with new idea andexplanation)
实现代码(Python3):
class Solution:
def canCompleteCircuit(self, gas, cost):
"""
:type gas: List[int]
:type cost: List[int]
:rtype: int
"""
if sum(gas) < sum(cost):
return -1
start, total, Min = 0, 0, sys.maxsize
for i in range(len(gas)):
total += gas[i] - cost[i]
if total < Min:
start = (i + 1)%len(gas)
Min = total
return start
提交结果:
![](https://i-blog.csdnimg.cn/blog_migrate/fdf876cda8bf3a270c76bdc148d4c9e5.jpeg)