LeetCode Gas Station

来源:互联网 发布:大数据前沿技术及应用 编辑:程序博客网 时间:2024/04/30 04:53

LeetCode解题之Gas Station


原题

在一条环形的路上有N个加油站,每个加油站里有gas[i]的汽油,从第i个加油站到第i+1个加油站需要花费cost[i]的汽油。假设汽车的油箱可以装无数的汽油,判断一辆没有油的汽车是否可以从其中的某一个加油站出发并行驶一圈后返回该加油站。如果可以的话,返回起始加油站的下标,否则返回-1。

注意点:

  • 如果有答案的话,答案是唯一的
  • 不用考虑逆向行驶

例子:

输入: gas = [5, 1, 2, 3, 4], cost = [4, 4, 1, 5, 1]

输出: 4

解题思路

选择从一个加油站出发,如果车要能够到达下一个加油站,就需要这个加油站的gas>cost。不妨设c[i] = gas[i] - cost[i],c[i]表示的是从某一加油站得到的汽油减去到达下一个加油站需要耗费的汽油后剩余的汽油数目,对c求和得到的是从出发开始到当前加油站剩余的汽油数目,如果这个这个和为负,说明当前这种行驶方案无法到达当前的加油站。也就是说要使车能够不断的向前行进,就要保证途中对c的求和始终大于0。

如果cost的和大于gas的和,显然汽车是无法成功走完一圈的,下面证明如果cost的和小于等于gas的和,必然存在一种方案能够让汽车走完一圈。

现在有c[0]+c[1]+...+c[n-2]+c[n-1]>=0,我们对c的前i项求和,假设当i=j时,这个和是所有和中最小的,也就是说:

c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...c[j]c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...c[j]+c[j+1]...c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...c[j]+c[j+1]+...+c[n-1]

也就是说:

c[j]>=0c[j]+c[j+1]>=0...c[j]+c[j+1]+...+c[n-1]>=0

同时,因为前j项的求和是最小的,还能得到下面的不等式:

c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...+c[j-2]c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...+c[j-3]...c[0]+c[1]+...+c[j-1]<=c[0]

转换可以得到:

c[j-1]<=0c[j-2]+c[j-1]<=0...c[1]+c[1]+...+c[j-1]<=0

再组合最初始的条件c[0]+c[1]+...+c[n-2]+c[n-1]>=0,我们可以得到:

c[j]+c[j+1]+...+c[n-1]+c[0]+c[1]+...+c[j-2]>=0c[j]+c[j+1]+...+c[n-1]+c[0]+c[1]+...+c[j-3]>=0c[j]+c[j+1]+...+c[n-1]+c[0]>=0

至此我们可以看出,如果从j出发的话,对c的求和始终都满足大于等于零的要求,也就是说j是我们选择出发的加油站。

AC源码

class Solution(object):    def canCompleteCircuit(self, gas, cost):        """        :type gas: List[int]        :type cost: List[int]        :rtype: int        """        if sum(gas) < sum(cost):            return -1        min_sum, min_index, total = 0, 0, 0        for i in range(len(gas)):            total += gas[i] - cost[i]            if min_sum > total:                min_sum, min_index = total, i + 1        return -1 if total < 0 else min_indexif __name__ == "__main__":    assert Solution().canCompleteCircuit([5], [4]) == 0    assert Solution().canCompleteCircuit([5, 1, 2, 3, 4], [4, 4, 1, 5, 1]) == 4

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 浦发银行办理房贷流水不够怎么办 房贷审批过程中突然换工作怎么办 建行快贷结清后无额度怎么办 建设银行快贷逾期2个月怎么办 全职速卖通一个月没订单要怎么办 买家点的好评写的差评怎么办 手机流量把话费扣没了怎么办 街电忘记还怎么办3天了 街电1个星期没还怎么办 苹果手机设置密码忘记问题了怎么办 买房付了首付后无法办按揭怎么办 苹果x导入通讯录不显示名字怎么办 苹果切换了id通讯录没有了怎么办 换了id通讯录记录没有了怎么办 4s升级系统通讯录没了怎么办 手机接听声音小怎么办但插耳机正常 苹果6p手机听筒声音小怎么办 苹果6s接电话对方声音小怎么办 iphone死机了怎么办关机也关不了 苹果7p卡死sos了怎么办 苹果x死机且屏幕失灵怎怎么办 幸果手机开机数字便按不动了怎么办 苹果6s黑屏但没关机怎么办 苹果6p突然黑屏怎么办单冷接电话 华硕86u的5g掉线找不到怎么办 信而富额度被清0怎么办 贷款回访电话回答错两个问题怎么办 天天中彩票获取期号失败怎么办 借贷宝电话打到家里了怎么办 私人借款付了利息不下款怎么办 别人借钱不还打电话不接怎么办 有信电话给别人打电话不接怎么办 别人欠我材料钱不接电话怎么办 别人欠我两千块钱不接电话怎么办 欠下很多钱没法面对父母怎么办 客户货款已打但要求改包装怎么办 微信好友欠钱不还还把我拉黑怎么办 微信朋友欠钱把我拉黑了怎么办 淘宝东西寄回去订单号忘写了怎么办 商家退款后客户不退回商品怎么办 有凭证还了本金不消条怎么办