class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
size = len(gas)
#优化
n = len(gas)
i = 0
while i < n:
j = i
remain = gas[i]
while remain - cost[j] >= 0:
# 减去花费的加上新的点的补给
remain = remain - cost[j] + gas[(j + 1) % n]
j = (j + 1) % n
# j 回到了 i
if j == i:
return i
# 最远距离绕到了之前,所以 i 后边的都不可能绕一圈了
if j < i:
return -1
# i 直接跳到 j+ 1 开始考虑,因为i + 1 到 j 之间的节点不可能绕一圈
i = j + 1
return -1
#暴力法
for i in range(size):
if gas[i]>=cost[i]:
j=i
oil = gas[i]
cos = cost[i]
tmp_gas= gas[i+1:]+gas[:i]
tmp_cost = cost[i+1:]+cost[:i]
count=0
for j in range(size-1):
if oil-cos+tmp_gas[j]>=tmp_cost[j]:
oil = oil-cos+tmp_gas[j]
cos = tmp_cost[j]
count+=1
else:
break
if count==size-1 and oil-cos>=0:
return i
return -1
分析:
- 如果当前的油比cost大,那就可以从这个点开始,否则就不能从这个点开始
- 暴力法是比较好想的,就是特别耗时,需要优化
- 能不能到下个点的判断条件就是:remain-cost[j]>0
总结:对于循环的链表一定要进行取余操作。