前往
大廳
主題

LeetCode - 134. Gas Station 解題心得

Not In My Back Yard | 2022-08-10 12:00:19 | 巴幣 2 | 人氣 428

題目連結:


題目意譯:
現在有 n 個加油站位於一個環形的路徑上,其中第 i 個加油站的油量為 gas[i]。

你現有著一台裝載著無限大的油箱之車輛,而它需要 cost[i] 單位的油量從第 i 個加油站開到下一個(第 i + 1 個)加油站。你一開始位於其中一個加油站並且油箱是空的。

給定兩整數陣列 gas 和 cost。如果你可以在這個環狀路徑開一圈的話,則回傳起始加油站的索引值;反之,回傳 -1。如果解存在,則其必唯一。

限制:
n == gas.length == cost.length
1 ≦ n ≦ 10 ^ 5
0 ≦ gas[i], cost[i] ≦ 10 ^ 4



範例測資:
範例 1:
輸入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
輸出: 3
解釋:
開始於加油站 3(索引值 3)並裝入 4 單位的油。你的油箱 = 0 + 4 = 4
開到加油站 4。你的油箱 = 4 - 1 + 5 = 8
開到加油站 0。你的油箱 = 8 - 2 + 1 = 7
開到加油站 1。你的油箱 = 7 - 3 + 2 = 6
開到加油站 2。你的油箱 = 6 - 4 + 3 = 5
開到加油站 3。成本為 5,而你擁有恰好足夠的油量可以開回到加油站 3。
因此,回傳 3 作為起始索引值。

範例 2:
輸入: gas = [2,3,4], cost = [3,4,3]
輸出: -1
解釋:
你無法開始於加油站 0 或 1,因為它們沒有足夠的油量可以開到下一個加油站。
讓我們開始於加油站 2 並填入 4 單位的油。你的油箱 = 0 + 4 = 4
開到加油站 0。你的油箱 = 4 - 3 + 2 = 3
開到加油站 1。你的油箱 = 3 - 3 + 3 = 3
你沒辦法開回到加油站 2,因為它將會需要 4 單位的油量而你只有 3 單位。
因此無論你從何處開始,你都無法繞一圈。


解題思維:
首先,要判斷有沒有解很簡單。把全部 (gas[i] - cost[i]) 之值加總,然後看這個總和有沒有 ≧ 0 即可。如果是則代表一定有解,因為代表一定存在從某處開始繞一圈加總起來,路上的「總和」皆為正,代表我們可以開過每個加油站;反之,則無解。

那在存在解的情況要怎麼找到那個唯一一個起始的索引值,很單純——就是從索引值 0 開始加總 (gas[i] - cost[i]),也就是先將「0」當作起始索引值。如果到了某處(例如索引值 x,x 可以為 0),使得目前的總和為負時,則我們現在可以確定從 0 ~ x 這 x + 1 個加油站是暢行無阻的。

問題是從 x 到 x + 1 的時候,而由於我們知道整體總和為正,因此我們可以改為試著從 x + 1 開始加總(不過記得把「當前總和」歸零)。如果這個 x + 1 又卡在一個索引值 y,則我們改為從 y + 1 開始……以此類推。而正因為整體總和為非負,因此這些「卡住」的地方將會由於從其他地方開始累積而變為可以通過。

再加上題目保證唯一解,因此上述過程我們必定可以找到一個索引值 i,使得我們可以在這個環形道路上繞一圈。因此次時的 i 即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作