前往
大廳
主題

LeetCode - 1642. Furthest Building You Can Reach 解題心得

Not In My Back Yard | 2021-06-10 00:00:01 | 巴幣 0 | 人氣 363

題目連結:


題目意譯:
你被給定一整數陣列 heights 代表著建築物的高度,以及一些磚頭和一些梯子。

你開始你的旅程於建築物 0 ,並且藉由磚頭和梯子移動到下一個建築物。

當從建築物 i 移動到建築物 i+1 (索引值從 0 開始):
如果當前建築物的高物大於或等於下一棟建築物之高度,則你不需要磚頭或是梯子。
如果當前建築物的高物小於下一棟建築物之高度,你可以使用一個梯子或者是 (h[i+1] - h[i]) 塊磚頭。

回傳你在最佳地使用著梯子和磚塊的情況下,最遠可以抵達的建築物之索引值(索引值從 0 開始)。

限制:
1 ≦ heights.length ≦ 10 ^ 5
1 ≦ heights[i] ≦ 10 ^ 6
0 ≦ bricks ≦ 10 ^ 9
0 ≦ ladders ≦ heights.length



範例測資:
範例 1:
輸入: heights = [4,2,7,6,9,14,12], bricks = 5, ladders = 1
輸出: 4
解釋: 開始於建築物 0 ,你可以遵循以下步驟:
- 走到建築物 1 並且不需要使用梯子或磚頭,因為 4 ≧ 2。
- 走到建築物 2 並且使用掉 5 個磚頭。你必須使用磚頭或是梯子,因為 2 < 7。
- 走到建築物 3 並且不需要使用梯子或磚頭,因為 7 ≧ 6。
- 走到建築物 4 並且使用掉你唯一的梯子。你必須使用磚頭或是梯子,因為 6 < 9。
不可能走超過建築物 4 ,因為你此時沒有更多的磚頭以及梯子了。

範例 2:
輸入: heights = [4,12,2,7,3,18,20,3,19], bricks = 10, ladders = 2
輸出: 7

範例 3:
輸入: heights = [14,3,19,3], bricks = 17, ladders = 0
輸出: 3


解題思維:
定義一個優先佇列(Priority Queue)PQ 用來儲存建築物之間的高度差值。

掃過陣列 heights ,對於每個建築物 heights[i] 判斷下一個建築物 heights[i + 1] 是否大於它。

如果是,我們則定義 D = heights[i + 1] - heights[i]。然後將 D 值推入 PQ 中,並試著先用磚頭到達下一個建築物。因此 bricks 要減去 D 。

當 bricks < 0 時,則代表磚頭不夠從第 i 棟建築物跑到第 i + 1 棟建築物。此時我們可以試著使用梯子替換掉前面兩棟建築物間磚頭使用量最大的時候,也就是 PQ.top() (C++ 的優先佇列預設其頂端元素為最大值(前提是存整數值))。因此 bricks 就可以加回 PQ.top() 之值,然後我們移除 PQ 頂端元素(即呼叫 PQ.pop()),並且將梯子數 ladders 減去 1。

當然,當 ladders == 0 時我們便無法執行以上的動作。因此第 i 棟建築物,即是我們所能抵達的最遠之建築物。因此回傳 i 。

而如果掃完所有建築物後,我們可以成功地抵達最後一棟,則回傳 heights.length - 1(減 1 是因為索引值從 0 開始數)。




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

創作回應

更多創作