LeerCode:(Python)(Array) Gas Station

許博淳
數據共筆
Published in
5 min readOct 23, 2023

題目連結: https://leetcode.com/problems/gas-station/description/?envType=study-plan-v2&envId=top-interview-150

題意說明:

  • 給定兩個 Array,代表每個位置的加油站油量,以及到達下一個地點的油耗
  • 找出要從哪一個位置開始旅行才能走一圈回到原點
  • 只會有唯一一個解答

初始想法

逐一把每個點當作起始點,重新拼裝 Array -> 感覺就會很慢

起始點的油量,至少要比起始點到下一點的油耗多,否則根本無法移動

偷看了別人的解答

實作程式碼一

# 解題邏輯: 分離兩個計算
# 1. 尋找起始點
# 2. 確認是否有解答

# 建立三個變數
# 起始位置,由零開始的累積油量,由起始點開始的累積油量
start_position = 0
Cumulated_Gas_From_Zero_Position = 0
Cumulated_Gas_From_Start = 0

# 解題邏輯,假設第一個位置就是正確起始位置,如果後續有足夠證據就推翻
# 將正確起始位置持續往後移動,直到找到
# 如果後續一直沒有找到可以推翻正確起始位置的情況,那最後一個暫定的起始位置就是解答

# 持續累加由零開始的累積油量,最後用來判斷是否有解
# 如果現在的位置,獲取的汽油 + 起始點至今累積的汽油,比消耗的油多,這樣根本到不了下個點
# 換句話說,目前的起始點就不是正確的起始點
for i in range(len(gas)):
Cumulated_Gas_From_Zero_Position = Cumulated_Gas_From_Zero_Position + gas[i] - cost[i]
if (gas[i]+Cumulated_Gas_From_Start) < cost[i]:
start_position = i + 1
Cumulated_Gas_From_Start = 0
else:
Cumulated_Gas_From_Start = Cumulated_Gas_From_Start + gas[i] - cost[i]

# 如果累積的油量小於0,那就根本無解,回傳 -1
# 否則回傳正確的起始位置
if Cumulated_Gas_From_Zero_Position < 0:
return -1
else:
return start_position

能正確解題但表現普通

後續來一一反思

反思一

不需要逐步加總油量和油耗,可以直接 Sum起來

可以一次算完就不要一步一步來,可以判斷出無解就不要浪費時間運算

if sum(gas) - sum(cost) <0:
return -1

start_position = 0
Cumulated_Gas_From_Start = 0

for i in range(len(gas)):
if (gas[i]+Cumulated_Gas_From_Start) < cost[i]:
start_position = i + 1
Cumulated_Gas_From_Start = 0
else:
Cumulated_Gas_From_Start = Cumulated_Gas_From_Start + gas[i] - cost[i]

return start_position

再進一步拿掉多餘計算

# 不要用 a - b <0,直接用 a < b
if sum(gas) < sum(cost):
return -1

start_position = 0
Cumulated_Gas_From_Start = 0

for i in range(len(gas)):
if (gas[i]+Cumulated_Gas_From_Start) < cost[i]:
start_position = i + 1
Cumulated_Gas_From_Start = 0
else:
Cumulated_Gas_From_Start = Cumulated_Gas_From_Start + gas[i] - cost[i]

return start_position

反思二

看到 Memory贏過這麼多人,打算多花費一些空間來換運算時間

發現有兩行 Code重複計算: 累積剩下的油 + 加油站的油 - 油耗,將這段拉出來成為變數

if sum(gas) < sum(cost):
return -1

start_position = 0
Cumulated_Gas_From_Start = 0
current_status = 0

for i in range(len(gas)):
current_status = Cumulated_Gas_From_Start + gas[i] - cost[i]
if current_status <0:
start_position = i + 1
Cumulated_Gas_From_Start = 0
else:
Cumulated_Gas_From_Start = current_status

return start_position

--

--