日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

[LeetCode] 871. Minimum Number of Refueling Stops @ python

發布時間:2023/12/20 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [LeetCode] 871. Minimum Number of Refueling Stops @ python 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.題目:
初始油量startFuel,給一個到達目的地所需的油量target,還有沿途的加油站stations(包括到達加油站所需油量以及儲備的油量),求達到目的地所需的最少加油次數,如果到不了返回-1.
二.解題思路:
首先看到最少加油次數,我們會想到從動態規劃上解題.這里設dp[i]表示第i次加油之后可以達到的最遠距離.每次遍歷到第n個加油站時,我們都需要更新dp[1]-dp[n]之間的所有值.
代碼如下:

class Solution(object):def minRefuelStops(self, target, startFuel, stations):""":type target: int:type startFuel: int:type stations: List[List[int]]:rtype: int"""#動態規劃,設dp[i]表示第i次加油之后可以達到的最遠距離dp = [startFuel] + [0] * len(stations) # 初始化dpfor i, (loc, cap) in enumerate(stations): # 遍歷加油站for t in range(i, -1, -1):if dp[t] >= loc: # 如果第t次加油后,可以到達 當前加油站的位置。dp[t+1] = max(dp[t+1], dp[t] + cap) # 嘗試的更新dpfor i, d in enumerate(dp): # 遍歷出最小次數if d >= target: return ireturn -1

其實還有一種更為巧妙的方法,也就是基于貪心的思想.我們記錄當前的油量cur,同時把沿途的加油站記錄下來放到堆中,知道找到油量不能支持的那個加油站停止,然后在堆中找一個油量最多的加油站,更新當前的油量同時加油次數+1,如果發現堆中沒有元素了也就是說明即使我們把沿途的所有加油站的油都算上了,也到不了下一個加油站了.
代碼如下:

class Solution(object):def minRefuelStops(self, target, startFuel, stations):""":type target: int:type startFuel: int:type stations: List[List[int]]:rtype: int"""#貪心法steps = 0cur = startFuelheap = []i = 0while True:#如果到達終點了if cur >= target:return steps#把沿途的加油站記錄下來 ,找到油量不能支持的前一個加油站while i < len(stations) and cur>=stations[i][0]:heapq.heappush(heap,-stations[i][1])i +=1if not heap:return -1#在沒油的時候,選擇沿途油量最多的一個加油站加油cur -= heapq.heappop(heap)steps +=1

總結

以上是生活随笔為你收集整理的[LeetCode] 871. Minimum Number of Refueling Stops @ python的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。