《Leetcode of November》134.加油站

128 篇文章 0 订阅

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

总结:对于循环的链表一定要进行取余操作。 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值