134. 加油站

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值