每日一题|134. 加油站|循环数组单次遍历

本题题目比较绕,理解了之后发现就是给一个一维数组表示余量,找出能够首尾相连且后构成每个位置处的累积和都是正数的索引。

首先,根据cost和gas相减,确定每个位置出发去下一个位置所剩余的gas。 

这里可以直接统计全部的余量和,如果小于0可以直接return -1了。

然后开始遍历,从0开始,到len-1截止,为什么只要遍历一个数组长度就够了?

假设1-2这一段是<0的,那么意味着从0出发不能走到0,所以我们更新初始位置和cur=0,然后从2-i这一段依然是<0的,说明2出发无法走回2,所以更新位置为i,cur = 0。这时遍历到数组末尾的时候发现累积和>0,说明i可以作为初始位置,有可能走完全程。

这时,结合之前全程的累计和就可以判断:
如果全程累计和 < 0,直接-1;如果累计和>0,说明最后一次更新位置信息的索引就是出发位置(题干保证了唯一性)。

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        gas_left = [gas[i] - cost[i] for i in range(len(cost))]
        total_gas = 0
        cur_gas = 0
        start = 0
        for i in range(len(gas_left)):
            total_gas += gas_left[i]
            cur_gas += gas_left[i]
            if cur_gas < 0:
                cur_gas = 0
                start = i + 1
        if total_gas < 0:
            return -1
        return start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值