134. 加油站
方法一:暴力遍历
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
if sum(cost) > sum(gas):return -1
n = len(cost)
for i in range(n):
tank = 0
for j in range(n):
k = (i + j) % n
tank += gas[k] - cost[k]
if tank < 0:break
else:
return i
return -1
方法二:一次遍历
如果从某个 start 开始到当前 i 油不够了,说明 start => i 不可达,后面的总油量一定足够,所以从下一个 i + 1 开始找下去,一定能找到符合条件的起点。
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
if sum(gas) - sum(cost) < 0: return -1
n, tank, start = len(cost), 0, 0 # tank 记录油箱中的油量 start 记录起点
for i in range(n):
tank += gas[i] - cost[i];
# 如果油箱中油量小于 0,则从下一个加油站重新开始,说明无法从 0 走到 i。
if tank < 0:
tank = 0
start = i + 1
return start
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
n = len(cost)
tank = total = start = 0
for i in range(n):
tank += gas[i] - cost[i]
if tank < 0:
start = i + 1
total += tank # 汇总 最后还得 + tank
tank = 0
return start if tank + total >= 0 else -1