【題目描述】 bash
本題採用的是一種貪心策略,不考慮總體最優,只着眼於當前。讀題目會發現,此題並不強調最優,能夠有多種解,以多個點爲起點均有可能實現環路走一圈。所以,制定一個貪心策略,知足條件便可。app
本題以gas[i]-cost[i]造成新列表new_list,找new_list中,以每一個位置爲出發點到最後一個節點到最後一個節點的累加之和,找使得這個累加之和最大的節點爲起點。即求從節點1到節點5,節點2到節點5,節點3到節點5,節點4到節點5的new_list值之和最大的節點。優化
若是從前向後加的話,會產生重複計算,時間複雜度O(n*n),代碼以下:ui
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),只是對每一個節點作了一次加法而已,代碼以下:spa
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]
複製代碼
【源代碼】3d
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))
複製代碼