贪心:尽量将gas[i]-cost[i]>0的放在前面,gas[i]-cost[i]<0的放在后面。(路程的前面有汽油剩下,耗汽油的放在路程的后面)。

能否全程通过的 条件 是:sum(gas[i])>=sum(cost[i]),不满足这个条件就不能全程走一遍;

起点 i 满足的 必要 条件 是:额外剩下的gas(additional_gas)要大于等于0,即 gas[i]-cost[i]>=0;

另外需满足:

找出某站点 i_save ,经过这个站点剩下的gas最多,找出某站点 i_need ,经过这个站点所欠的gas最多,

“额外需要gas最多的站点”应该放在最后,“额外剩下gas最多的站点”应该放首位,优先将“额外剩下gas最多的站点”放首位;

如果 “额外需要gas最多的i”>“额外剩下gas最多的i”(-additional_gas[need]>=additional_gas[save]),则将“额外需要gas最多的i”放在最后。

如果“额外需要gas最多的i”和“额外剩下gas最多的i”有不止一个,则“额外需要gas最多的i”取最后一个,“额外剩下gas最多的i”取最前面那个。

例如:

i 0 1 2 3 4
gas 1 2 3 4 5
cost 3 4 5 1 2
 additional_gas -2 -2 -2 3 3

起始站点为i=3。

自认为是比较简洁的代码:

class Solution:
# @param gas, a list of integers
# @param cost, a list of integers
# @return an integer
def canCompleteCircuit(self, gas, cost):
additional_gas=[]
for i in range(len(gas)):
additional_gas.append(gas[i]-cost[i])
if sum(additional_gas)<0:
return -1
need=0
save=0
for i in range(len(gas)):
if additional_gas[i]>0 and additional_gas[i]>additional_gas[save]:
save=i
if additional_gas[i]<0 and additional_gas[i]<=additional_gas[need]:
if i<len(gas)-1 and additional_gas[i+1]>0:
need=i
if -additional_gas[need]>additional_gas[save]:
return need+1
else:
return save if __name__ == '__main__':
s=Solution()
print(s.canCompleteCircuit([6,1,2,3,2,1,8],[1,7,2,2,2,8,1]))

下面的代码也能通过。

class Solution:
# @param gas, a list of integers
# @param cost, a list of integers
# @return an integer
def canCompleteCircuit(self, gas, cost):
additional_gas=[]
for i in range(len(gas)):
additional_gas.append(gas[i]-cost[i])
if sum(additional_gas)<0:
return -1
start=0
for i in range(1,len(gas)):
if (additional_gas[i]>=0 and additional_gas[i-1]<0):
start=i
return start

Gas Station|leetcode 贪心的更多相关文章

  1. 134. Gas Station leetcode

    134. Gas Station 不会做. 1. 朴素的想法,就是针对每个位置判断一下,然后返回合法的位置,复杂度O(n^2),显然会超时. 把这道题转化一下吧,求哪些加油站不能走完一圈回到自己,要求 ...

  2. Gas Station [LeetCode]

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  3. Gas Station——LeetCode

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  4. Gas Station leetcode java

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

  5. Gas Station [leetcode] 两个解决方案

    因为gas的总数大于cost总时间.你将能够圈住整个城市. 第一溶液: 如果一開始有足够的油.从位置i出发.到位置k时剩余的油量为L(i,k). 对随意的k.L(i,k)依据i的不同,仅仅相差常数. ...

  6. [LeetCode] Gas Station 贪心

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  7. 贪心:leetcode 870. Advantage Shuffle、134. Gas Station、452. Minimum Number of Arrows to Burst Balloons、316. Remove Duplicate Letters

    870. Advantage Shuffle 思路:A数组的最大值大于B的最大值,就拿这个A跟B比较:如果不大于,就拿最小值跟B比较 A可以改变顺序,但B的顺序不能改变,只能通过容器来获得由大到小的顺 ...

  8. LeetCode: Gas Station 解题报告

    Gas Station There are N gas stations along a circular route, where the amount of gas at station i is ...

  9. [LeetCode 题解]:Gas Station

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 There are ...

随机推荐

  1. 关于var(string)++的类型自动转换

    展示时间: var miao="50"; var fen="59"; var shi="00"; setInterval(fun, 1000 ...

  2. javaweb学习路之三--websocket多人在线聊天

    在之前的项目基础上,加入了一个聊天室的功能,为了界面好看 引入了AmazeUI和umeditor最终效果图如下: 源码在 https://github.com/Zering/MyWeb 目前练习都在这 ...

  3. BCS--使用SharePoint Designer创建外部内容类型

    使用SharePoint Designer创建外部列表(也可以在浏览器中创建列表) http://www.cnblogs.com/haogj/archive/2011/05/01/2033845.ht ...

  4. 使用VS创建WebPart部件,并部署到SP(待修改)

    http://www.cnblogs.com/mingmingruyuedlut/archive/2012/12/02/2789488.html

  5. 无法编辑的word解密

    打开文档后,将其另存为XML文件,然后用UltraEdit(或者EditPlus,下载华军里搜索一下就行了)这个编辑软件打开刚刚存储的 XLM文件,查找<w:documentProtection ...

  6. [LeetCode]题解(python):066-Plus One

    题目来源: https://leetcode.com/problems/plus-one/ 题意分析: 给定一个数组,将数加一,返回新的数组.比如[9,9],返回[1,0,0]. 题目思路: 这道题目 ...

  7. vs2010中iostream.h出错

    使用 #include <iostream> using namespace std; 替代 VS2010删除了所有非标准库,保留了C++标准库,iostream.h是以前旧版的库,VS2 ...

  8. django-celery提供给顾客使用实例

    导入数据库 from djcelery import models as celery_models   celery_models.PeriodicTask.objects.create(...) ...

  9. Code 16K 码

    Code 16K 码是一种多层.连续型.可变长度的条码符号,可以表示全ASCII字符集的128个字符及扩展ASCII字符.它采用UPC及Code128字符.一个16层的Code 16K符号,可以表示7 ...

  10. 在windows下的QT编程中的_TCHAR与QString之间的转换

    由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef ...