zoukankan      html  css  js  c++  java
  • Gas Station|leetcode 贪心

    贪心:尽量将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
  • 相关阅读:
    C/C++字符串转换函数;
    MFC CTreeCtrl 递归遍历算法
    汉字转拼音
    Windows之权限讲解
    Ubuntu 保存文件时报E212
    ON_WM_MOUSEWHEEL无响应
    sln、db、opendb、vcxproj、filters、user文件跟踪说明
    iOS 9: UIStackView入门
    Swift语言Storyboard教程:第一部分
    springboot启动项目报错:ERROR:o.s.b.d.LoggingFailureAnalysisReporter解决办法
  • 原文地址:https://www.cnblogs.com/iois/p/4042484.html
Copyright © 2011-2022 走看看