每日一道算法题--leetcode 134--加油站--python

645 阅读1分钟

【题目描述】

【思路解析】

本题采用的是一种贪心策略,不考虑整体最优,只着眼于当前。读题目会发现,此题并不强调最优,可以有多种解,以多个点为起点均有可能实现环路走一圈。因此,制定一个贪心策略,满足条件即可。

本题以gas[i]-cost[i]形成新列表new_list,找new_list中,以每个位置为出发点到最后一个节点到最后一个节点的累加之和,找使得这个累加之和最大的节点为起点。即求从节点1到节点5,节点2到节点5,节点3到节点5,节点4到节点5的new_list值之和最大的节点。

如果从前向后加的话,会产生重复计算,时间复杂度O(n*n),代码如下:

 new_list=[gas[i]-cost[i] for i in range(len(gas))]
 re=[sum(new_list[i:len(gas)]) for i in range(len(gas))]

优化一下,从后向前计算,如此一来时间复杂度是O(n),只是对每个节点做了一次加法而已,代码如下:

new_list=[gas[i]-cost[i] for i in range(len(gas))]
re=[0 for _ in range(len(gas)-1)]
re.append(new_list[len(gas)-1])
for i in range(len(gas)-2,-1,-1):
  re[i]=new_list[i]+re[i+1]

【源代码】

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        if sum(gas)<sum(cost):
            return -1
        new_list=[gas[i]-cost[i] for i in range(len(gas))]
        re=[0 for _ in range(len(gas)-1)]
        re.append(new_list[len(gas)-1])
        for i in range(len(gas)-2,-1,-1):
            re[i]=new_list[i]+re[i+1]
        return re.index(max(re))