LeetCode:871. Minimum Number of Refueling Stops - Python
問(wèn)題描述:
871. 最低加油次數(shù)汽車從起點(diǎn)出發(fā)駛向目的地,該目的地位于出發(fā)位置東面 target英里處。
沿途有加油站,每個(gè)station[i] 代表一個(gè)加油站,它位于出發(fā)位置東面 station[i][0] 英里處,并且有 station[i][1] 升汽油。
假設(shè)汽車油箱的容量是無(wú)限的,其中最初有 startFuel 升燃料。它每行駛 1 英里就會(huì)用掉 1 升汽油。
當(dāng)汽車到達(dá)加油站時(shí),它可能停下來(lái)加油,將所有汽油從加油站轉(zhuǎn)移到汽車中。
為了到達(dá)目的地,汽車所必要的最低加油次數(shù)是多少?如果無(wú)法到達(dá)目的地,則返回-1。
注意:如果汽車到達(dá)加油站時(shí)剩余燃料為 0,它仍然可以在那里加油。如果汽車到達(dá)目的地時(shí)剩余燃料為 0,仍然認(rèn)為它已經(jīng)到達(dá)目的地。
示例 1:
輸入:target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]]
輸出:2
解釋:我們出發(fā)時(shí)有 10 升燃料。我們開(kāi)車來(lái)到距起點(diǎn) 10 英里處的加油站,消耗 10 升燃料。將汽油從 0 升加到 60 升。然后,我們從 10 英里處的加油站開(kāi)到 60 英里處的加油站(消耗 50 升燃料),并將汽油從 10 升加到 50 升。然后我們開(kāi)車抵達(dá)目的地。我們沿途在1兩個(gè)加油站???#xff0c;所以返回 2 。
提示:
- 1 <= target, startFuel, stations[i][1] <= 10^9
- 0 <= stations.length <= 500
- 0 < stations[0][0] < stations[1][0] < ... < stations[stations.length-1][0] < target
問(wèn)題分析:
這個(gè)題目使用動(dòng)態(tài)規(guī)劃的思想,基本思路,設(shè)dp[i]表示第i次加油之后可以達(dá)到的最遠(yuǎn)距離,很顯然,i <= 加油站的個(gè)數(shù),求出dp之后,從頭遍歷一邊,找到第一個(gè) dp[i] >= target 的 i ,就是最少的加油次數(shù),如果沒(méi)有就返回-1。
(1)問(wèn)題 dp[i] 怎么求? 首先,從頭開(kāi)遍歷加油站,每當(dāng)遍歷到第i個(gè)加油站時(shí),dp[t+1] = max(dp[t+1], dp[t] + arr[i]),其中t+1 <= i,然后依次,從后向前更新dp,可以這樣理解,dp[t] 再加一次油arr[i],得到的新的dp[t+1]是否是比之前的dp[t+1]大?如果大就更新。依次遍歷遞推,直至結(jié)束。值得思考是的,仔細(xì)觀察遞推公式:dp[t+1] = max(dp[t+1], dp[t] + arr[i])你會(huì)發(fā)現(xiàn),無(wú)論更新與否,dp[t+1] 始終代表的是第 t+1 次加油。
Python3實(shí)現(xiàn):
# @Time :2018/7/25 # @Author :Yinxing # 動(dòng)態(tài)規(guī)劃 時(shí)間復(fù)雜度 O(N^2K) 空間復(fù)雜度 O(N)class Solution:def minRefuelStops(self, target, startFuel, stations):dp = [startFuel] + [0] * len(stations) # 初始化dpfor i, (loc, cap) in enumerate(stations): # 遍歷加油站for t in range(i, -1, -1):if dp[t] >= loc: # 如果 第 t 加油后,可以到達(dá) 當(dāng)前加油站的位置。dp[t+1] = max(dp[t+1], dp[t] + cap) # 嘗試的更新dpfor i, d in enumerate(dp): # 遍歷出最小次數(shù)if d >= target: return ireturn -1if __name__ == '__main__':solu = Solution()target, startFuel, stations = 100, 10, [[10, 60], [20, 30], [30, 30], [60, 40]]print(solu.minRefuelStops(target, startFuel, stations))歡迎指正哦。
總結(jié)
以上是生活随笔為你收集整理的LeetCode:871. Minimum Number of Refueling Stops - Python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用python写一个专属字典生成器
- 下一篇: python自己做课程表_Kivy做一个