【题目描述】

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