把這個題理解成下邊的圖就可以。
每個節點表示新增的油量,每條邊表示消耗的油量。題目的意思就是問我們從哪個節點出發,還可以回到該節點。只能順時針方向走。
考慮暴力破解,一方面是驗證下自己對題目的理解是否正確,另一方面後續的優化也可以從這裡入手。
考慮從第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 + 1
到j
之間的節點是不是就都不可能繞一圈了?
假設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 + 1
到j
之間的節點都不可能繞一圈了。想象成乙個圓,所以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。說明 示...