LeetCode 力扣 134 加油站

2021-10-05 12:28:13 字數 2899 閱讀 1583

把這個題理解成下邊的圖就可以。

每個節點表示新增的油量,每條邊表示消耗的油量。題目的意思就是問我們從哪個節點出發,還可以回到該節點。只能順時針方向走。

考慮暴力破解,一方面是驗證下自己對題目的理解是否正確,另一方面後續的優化也可以從這裡入手。

考慮從第0個點出發,能否回到第0個點。

考慮從第1個點出發,能否回到第 1 個點。

考慮從第2個點出發,能否回到第2個點。

考慮從第n個點出發,能否回到第n個點。

由於是個圓,得到下乙個點的時候我們需要取餘數。

public

intcancompletecircuit

(int

gas,

int[

] cost)}}

//任何點都不可以

return-1

;}

暴力破解慢的原因就是會進行很多重複的計算。比如下邊的情況:

假設當前在考慮 i,先初始化 j = i**

****

^ i^j

隨後 j 會進行後移**

****

^^i j

繼續後移**

****

^^i j

繼續後移**

****

^^

j i

此時 j 又回到了第 0 個位置,我們在之前已經考慮過了這個位置。

如果之前考慮第 0 個位置的時候,最遠到了第 2 個位置。

那麼此時 j 就可以直接跳到第 2 個位置,同時加上當時的剩餘汽油,繼續考慮**

****

^^

j i

利用上邊的思想我們可以進行乙個優化,就是每考慮乙個點,就將當前點能夠到達的最遠距離記錄下來,同時到達最遠距離時候的剩餘汽油也要記下來。

public

intcancompletecircuit

(int

gas,

int[

] cost)

//記錄到達最遠距離時候剩餘的汽油

int[

] farindexremain =

newint

[n];

for(

int i =

0; i < n; i++

)else

if(j == i)

}//記錄當前點最遠到達**

farindex[i]

= j;

//記錄當前點的剩餘

farindexremain[i]

= remain;

}return-1

;}

遺憾的是,這個想法針對leetcode的測試集速度上沒有帶來很明顯的提公升。不過記錄已經求出來的解進行優化,這個思想還是經常用的,也就是空間換時間。

讓我們換個思路繼續優化。

我們考慮一下下邊的情況。

***

***^

^i j

當考慮i能到達的最遠的時候,假設是j

那麼i + 1j之間的節點是不是就都不可能繞一圈了?

假設i + 1的節點能繞一圈,那麼就意味著從i + 1開始一定能到達j + 1

又因為從i能到達i + 1,所以從i也能到達j + 1

但事實上,i最遠到達j。產生矛盾,所以i + 1的節點一定不能繞一圈。同理,其他的也是一樣的證明。

所以下一次的i我們不需要從i + 1開始考慮,直接從j + 1開始考慮即可。

還有一種情況,就是因為到達末尾的時候,會回到0

如果對於下邊的情況。

***

***^

^ j i

如果i最遠能夠到達j,根據上邊的結論i + 1j之間的節點都不可能繞一圈了。想象成乙個圓,所以i後邊的節點就都不需要考慮了,直接返回-1即可。

public

intcancompletecircuit

(int

gas,

int[

] cost)

}//最遠距離繞到了之前,所以 i 後邊的都不可能繞一圈了

if(j < i)

//i 直接跳到 j,外層 for 迴圈執行 i++,相當於從 j + 1 開始考慮

i = j;

}return-1

;}

寫題的時候先寫出暴力的解法,然後再考慮優化,有時候是一種不錯的選擇。

更多詳細通俗題解詳見 leetcode.wang 。

go 力扣134 加油站

題目描述 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas i 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i 1 個加油站需要消耗汽油 cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 1。...

力扣刷題筆記 134 加油站

題目 134.加油站 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas i 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i 1 個加油站需要消耗汽油 cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否...

LeetCode貪心 134 加油站

題目描述 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油gas i 公升。你有一輛油箱容量無限的的汽車,從第i 個加油站開往第i 1 個加油站需要消耗汽油cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 1。說明 示...