本题题目比较绕,理解了之后发现就是给一个一维数组表示余量,找出能够首尾相连且后构成每个位置处的累积和都是正数的索引。
首先,根据cost和gas相减,确定每个位置出发去下一个位置所剩余的gas。
这里可以直接统计全部的余量和,如果小于0可以直接return -1了。
然后开始遍历,从0开始,到len-1截止,为什么只要遍历一个数组长度就够了?
假设1-2这一段是<0的,那么意味着从0出发不能走到0,所以我们更新初始位置和cur=0,然后从2-i这一段依然是<0的,说明2出发无法走回2,所以更新位置为i,cur = 0。这时遍历到数组末尾的时候发现累积和>0,说明i可以作为初始位置,有可能走完全程。
这时,结合之前全程的累计和就可以判断:
如果全程累计和 < 0,直接-1;如果累计和>0,说明最后一次更新位置信息的索引就是出发位置(题干保证了唯一性)。
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
gas_left = [gas[i] - cost[i] for i in range(len(cost))]
total_gas = 0
cur_gas = 0
start = 0
for i in range(len(gas_left)):
total_gas += gas_left[i]
cur_gas += gas_left[i]
if cur_gas < 0:
cur_gas = 0
start = i + 1
if total_gas < 0:
return -1
return start