前往
大廳
主題

LeetCode - 2498. Frog Jump II 解題心得

Not In My Back Yard | 2023-11-03 12:00:17 | 巴幣 0 | 人氣 77

題目連結:


題目意譯:
你被給定一個索引值從 0 開始且以嚴格遞增排序後的整數陣列 stones,代表著一條河上的石頭之位置。

一隻青蛙,一開始位於第一顆石頭之上,想要抵達最後一顆並折返至第一顆石頭。不過,牠只能跳到每一顆石頭最多一次。

一次跳躍的長度為青蛙目前處在的石頭之位置與青蛙要跳到的石頭之位置之間的絕對差值。

更正式地說,如果青蛙位於 stones[i] 並跳至了 stones[j],該次跳躍的長度為 |stones[i] - stones[j]|。

路徑的成本為該路徑上所有跳躍中長度最大者。

回傳該青蛙的路徑之最小成本。

限制:
2 ≦ stones.length ≦ 10 ^ 5
0 ≦ stones[i] ≦ 10 ^ 9
stones[0] == 0
stones 是以嚴格遞增排序。



範例測資:
範例 1:
輸入: stones = [0,2,5,6,7]
輸出: 5
解釋: 上圖代表著該青蛙可以採取的最佳路徑之一。
此路徑的成本為 5,其為一次跳躍中的最大長度。
由於不可能得到比 5 小的成本,我們將其回傳。

範例 2:
輸入: stones = [0,3,9]
輸出: 9
解釋:
青蛙可以直接跳到最後一顆石頭並回到第一顆石頭。
在這個情況下,每一次跳躍的長度將為 9。該路徑的成本將會是 max(9, 9) = 9。
可以證明這是最小可達成之成本。


解題思維:
(假設石頭數為 n 顆)
首先,可以觀察到 n 顆石頭都可以直接包含進最佳解之中。因為沒有包含到所有石頭的話,則我們可以把原本沒有包含的全部塞進去,而最長的跳躍長度可能不變也可能變短。因此必定存在一最佳解包含所有石頭。

接著,可以看到去程(或回程)每次若多跳過一顆石頭(即起跳點和落點之間還有另一顆石頭。不過會出現如落在第 n - 1 顆石頭就只能到第 n 顆石頭的這種,因此這個策略是「盡力而為」),而回程(或去程)則是跳剩下的石頭會是最佳解之一。而這其實有很直覺的解釋:去程(或回程)如果每一顆石頭都跳,則會沒辦法折返或是會直接違反規則;而如果有一個方式是多跳過兩顆石頭,則又跳太遠(因為我們一定可以只多跳過一顆石頭)。不過實際上嚴格證明需要考慮 n 的奇偶性並處理頭尾石頭的情況(為了確保我們真的可以做到只跳過一顆石頭),故在此略過。



因此我們可以直接掃過 stones,然後對於所有介於 2(含)~ n - 1(含) 的 i 值求出 (stones[i] - stones[i - 2]) 的最大值即為所求。

不過注意到 n == 2 時,因為我們只能從第一顆石頭跳到第二顆再跳回去,因此答案是 stones[1] - stones[0]。




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

創作回應

更多創作