LeetCode Gas Station

來源:互聯網
上載者:User

標籤:

LeetCode解題之Gas Station原題

在一條環形的路上有N個加油站,每個加油站裡有gas[i]的汽油,從第i個加油站到第i+1個加油站需要花費cost[i]的汽油。假設汽車的油箱可以裝無數的汽油,判斷一輛沒有油的汽車是否可以從其中的某一個加油站出發並行駛一圈後返回該加油站。如果可以的話,返回起始加油站的下標,否則返回-1。

注意點:

  • 如果有答案的話,答案是唯一的
  • 不用考慮逆向行駛

例子:

輸入: gas = [5, 1, 2, 3, 4], cost = [4, 4, 1, 5, 1]

輸出: 4

解題思路

選擇從一個加油站出發,如果車要能夠到達下一個加油站,就需要這個加油站的gas>cost。不妨設c[i] = gas[i] - cost[i],c[i]表示的是從某一加油站得到的汽油減去到達下一個加油站需要耗費的汽油後剩餘的汽油數目,對c求和得到的是從出發開始到當前加油站剩餘的汽油數目,如果這個這個和為負,說明當前這種行駛方案無法到達當前的加油站。也就是說要使車能夠不斷的向前行進,就要保證途中對c的求和始終大於0。

如果cost的和大於gas的和,顯然汽車是無法成功走完一圈的,下面證明如果cost的和小於等於gas的和,必然存在一種方案能夠讓汽車走完一圈。

現在有c[0]+c[1]+...+c[n-2]+c[n-1]>=0,我們對c的前i項求和,假設當i=j時,這個和是所有和中最小的,也就是說:

c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...c[j]c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...c[j]+c[j+1]...c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...c[j]+c[j+1]+...+c[n-1]

也就是說:

c[j]>=0c[j]+c[j+1]>=0...c[j]+c[j+1]+...+c[n-1]>=0

同時,因為前j項的求和是最小的,還能得到下面的不等式:

c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...+c[j-2]c[0]+c[1]+...+c[j-1]<=c[0]+c[1]+...+c[j-3]...c[0]+c[1]+...+c[j-1]<=c[0]

轉換可以得到:

c[j-1]<=0c[j-2]+c[j-1]<=0...c[1]+c[1]+...+c[j-1]<=0

再組合最初始的條件c[0]+c[1]+...+c[n-2]+c[n-1]>=0,我們可以得到:

c[j]+c[j+1]+...+c[n-1]+c[0]+c[1]+...+c[j-2]>=0c[j]+c[j+1]+...+c[n-1]+c[0]+c[1]+...+c[j-3]>=0c[j]+c[j+1]+...+c[n-1]+c[0]>=0

至此我們可以看出,如果從j出發的話,對c的求和始終都滿足大於等於零的要求,也就是說j是我們選擇出發的加油站。

AC源碼
class Solution(object):    def canCompleteCircuit(self, gas, cost):        """        :type gas: List[int]        :type cost: List[int]        :rtype: int        """        if sum(gas) < sum(cost):            return -1        min_sum, min_index, total = 0, 0, 0        for i in range(len(gas)):            total += gas[i] - cost[i]            if min_sum > total:                min_sum, min_index = total, i + 1        return -1 if total < 0 else min_indexif __name__ == "__main__":    assert Solution().canCompleteCircuit([5], [4]) == 0    assert Solution().canCompleteCircuit([5, 1, 2, 3, 4], [4, 4, 1, 5, 1]) == 4

歡迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 來獲得相關源碼。

LeetCode Gas Station

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.