题目:
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
我的思路:
用tried数组记录每个点是否遍历过
begin记录本次遍历的出发加油站
current记录当前加油站
last记录从begin到current的累计剩余油量
当last<0时,则说明begin到current的点都不可行(这个范围的点tried都设置成True),从current+1开始遍历
为了解决环的问题,current每次+1都对n求余
#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time : 2019/10/25 21:36
# @Author : Grey
from typing import List
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
n = len(gas)
if n == 0 or (n == 1 and gas[0] >= cost[0]):
return 0
if n == 1 and gas[0] < cost[0]:
return -1
# station = [-1 for _ in range(n)]
tried = [False for _ in range(n)]
res = False
begin = 0
current = 0
last = 0
while tried[begin] == False:
last = gas[current] - cost[current] + last
if last >= 0:
current = (current + 1) % n
if current == begin:
res = True
break
else:
if begin > current:
current = current + n
for i in range(begin, current+1):
tried[i % n] = True
begin = (current + 1) % n
current = begin
last = 0
return begin if res else -1
if __name__ == "__main__":
gas = [2, 3, 4]
cost = [3, 4, 3]
print(Solution.canCompleteCircuit("self", gas, cost))