算法分析与设计第七周:134. Gas Station

本文探讨了一辆汽车沿环路行驶的问题,需找到合适的起点使汽车能加满油完成一圈旅行。通过排除非法出发点的方法确定合法出发点,并提供了解决方案的Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目简介:
There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

Return the starting gas station’s index if you can travel around the circuit once, otherwise return -1.

提炼内容:
何为合法出发点:
1、该点p的pCost值小于pGas值
2、该点的后续节点q,若其qCost值大于qGas值,那么p中汽油剩余值(remainingGas = pGas - pCost) + qGas >= qCost
3、以此类推

算法思想:
1、找出所有的非法出发点
2、将非法出发点存入list unablePos
3、不在list中的出发点即为合法出发点
4、若出发点全在list中,则无合法出发点,程序返回-1

代码:

class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        #分别表示剩余汽油和所需汽油
        remainingGas , needGas, i = 0, 0, 0
        #用于保存非法出发点
        unablePos = []
        size = len(gas)
        #对每个出发点进行遍历并判断其是否合法
        while i < size:
            #遇到非法出发点
            if gas[i] < cost[i]:
                #保存非法出发点
                unablePos.append(i)
                #若下一个点是合法出发点,则从该出发点反序遍历
                #即遇到了gas: 3 4 5 第三个出发点
                #        cos: 2 3 6
                if gas[(i + 1) % size] >= cost[(i + 1) % size]:
                    #得到该节点需要的汽油量
                    needGas = cost[i] - gas[i]
                    index = i
                    #反序遍历直到前面的剩余汽油量达到需要汽油量值
                    while remainingGas < needGas:
                        if i == index + size:
                            return -1
                        index -= 1
                        #更新剩余汽油量值
                        remainingGas += gas[index] - cost[index]
                    #下一次检查前,将两个值归0
                    remainingGas = 0
                    needGas = 0
                    #保存非法出发点,区间(index, i]内的出发点都是非法的,
                    #因为这些节点都不没有足够的汽油可以使用
                    unablePos.extend([(x + size) % size for x in range(i,index,-1)])
            i += 1

        #寻找合理出发点
        pos = [[x,0] for x in range(size)]
        for i in unablePos:
            pos[i][1] = 1
        for i in pos:
            if i[1] == 0:
                return i[0]
        return -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值