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

【題目描述】 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))
複製代碼
相關文章
相關標籤/搜索