871 最低加油次數

2021-08-25 11:15:28 字數 1661 閱讀 4646

汽車從起點出發駛向目的地,該目的地位於出發位置東面target英里處。

沿途有加油站,每個station[i]代表乙個加油站,它位於出發位置東面station[i][0]英里處,並且有station[i][1]公升汽油。

假設汽車油箱的容量是無限的,其中最初有startfuel公升燃料。它每行駛 1 英里就會用掉 1 公升汽油。

當汽車到達加油站時,它可能停下來加油,將所有汽油從加油站轉移到汽車中。

為了到達目的地,汽車所必要的最低加油次數是多少?如果無法到達目的地,則返回-1

注意:如果汽車到達加油站時剩餘燃料為 0,它仍然可以在那裡加油。如果汽車到達目的地時剩餘燃料為 0,仍然認為它已經到達目的地。

示例 1:

輸入:target = 1, startfuel = 1, stations = 

輸出:0

解釋:我們可以在不加油的情況下到達目的地。

示例 2:

輸入:target = 100, startfuel = 1, stations = [[10,100]]

輸出:-1

解釋:我們無法抵達目的地,甚至無法到達第乙個加油站。

示例 3:

輸入:target = 100, startfuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]]

輸出:2

解釋:我們出發時有 10 公升燃料。

我們開車來到距起點 10 英里處的加油站,消耗 10 公升燃料。將汽油從 0 公升加到 60 公升。

然後,我們從 10 英里處的加油站開到 60 英里處的加油站(消耗 50 公升燃料),

並將汽油從 10 公升加到 50 公升。然後我們開車抵達目的地。

我們沿途在1兩個加油站停靠,所以返回 2 。

1 <= target, startfuel, stations[i][1] <= 10^90 <= stations.length <= 5000 < stations[0][0] < stations[1][0] < ... < stations[stations.length-1][0] < target

思路:首先我們需要明白,乙個車最終能走多遠取決於他在中途加過多少油(可以自己手算驗證一下)。

我們維護乙個車當前能夠到達的最遠距離,在這個距離內,每經過乙個加油站,如果不加油,那麼最遠距離不變,如果加油,最遠距離加上該加油站的油量。

我們總是希望加更多的油,停留更少的加油站,這決定了我們要在所能到達的加油站中,加最多的油那一站停。這就需要排序目前能夠到達的最遠距離的各個加油站的油量,每次走不動的時候我們就選最大油量去加。於是考慮用優先佇列去儲存。直到最後佇列是否為空,如果為空還沒到達target,那麼就返回-1。其實一般情況下在隊列為空之前,就會到達target.

code:

class solution 

return -1;

}};

871 最低加油次數

class solution 如果當前餘下的汽油不足以跑到這個加油站 while curpos gasleft curstationpos 那麼著找出之前加油最多的油來加 把最多的油加上去 gasleft q.top q.pop addgastimes 向前開的過程中肯定存在油量的消耗 const ...

871 最低加油次數

汽車從起點出發駛向目的地,該目的地位於出發位置東面 target 英里處。沿途有加油站,每個 station i 代表乙個加油站,它位於出發位置東面 station i 0 英里處,並且有 station i 1 公升汽油。假設汽車油箱的容量是無限的,其中最初有 startfuel 公升燃料。它每行...

871 最低加油次數

汽車從起點出發駛向目的地,該目的地位於出發位置東面target英里處。沿途有加油站,每個station i 代表乙個加油站,它位於出發位置東面station i 0 英里處,並且有station i 1 公升汽油。假設汽車油箱的容量是無限的,其中最初有startfuel公升燃料。它每行駛 1 英里就...