7.3
贪心1
其实贪心1有助于理解贪心2中为什么totalsum>0就一定可以完成循环。当情况1与情况2都不满足时,意味着totalsum>0但是从0站开始循环的过程中中间某站出现了累加和小于0。那么我们从后往前找到某一个rest = gas[i] - cost[i],即从这个站台出发可以余下rest的油,此时起始量为rest那么到达之前累加和为负的那个站点时,油量比从0站点出发多出rest
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
curSum = 0 # 当前累计的剩余油量
minFuel = float('inf') # 从起点出发,油箱里的油量最小值
for i in range(len(gas)):
rest = gas[i] - cost[i]
curSum += rest
if curSum < minFuel:
minFuel = curSum
if curSum < 0:
return -1 # 情况1:整个行程的总消耗大于总供给,无法完成一圈
if minFuel >= 0:
return 0 # 情况2:从起点出发到任何一个加油站时油箱的剩余油量都不会小于0,可以从起点出发完成一圈
for i in range(len(gas) - 1, -1, -1):
rest = gas[i] - cost[i]
minFuel += rest
if minFuel >= 0:
return i # 情况3:找到一个位置使得从该位置出发油箱的剩余油量不会小于0,返回该位置的索引
return -1 # 无法完成一圈
贪心2
只要出现累加油量小于0,那么此前的所有站都不能作为出发点(以此前任意站为出发点,到当前站时累加油量一定是负)
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
cursum = 0
totalsum = 0
start = 0
for i in range(len(gas)):
cursum += gas[i] - cost[i]
totalsum += gas[i] - cost[i]
if cursum < 0:
# 这意味着第i个加油站即其之前的加油站都不能当作起始点
# 这个问题仔细想一下可以明白
start = i+1
cursum = 0
if totalsum >= 0:
return start
else: return -1