【Leet-Code】45. 跳躍遊戲 II

 

【解題思路】

 

「貪心」地進行正向查找,每次找到可到達的最遠位置,就可以在線性時間內得到最少的跳躍次數。

例如,對於數組 [2,3,1,2,4,2,3],初始位置是下標 0,從下標 0 出發,最遠可到達下標 2。下標 0 可到達的位置中,下標 1 的值是 3,從下標 1 出發可以達到更遠的位置,因此第一步到達下標 1。

從下標 1 出發,最遠可到達下標 4。下標 1 可到達的位置中,下標 4 的值是 4 ,從下標 4 出發可以達到更遠的位置,因此第二步到達下標 4。

在具體的實現中,我們維護當前能夠到達的最大下標位置,記爲邊界。我們從左到右遍歷數組,到達邊界時,更新邊界並將跳躍次數增加 1。

在遍歷數組時,我們不訪問最後一個元素,這是因爲在訪問最後一個元素之前,我們的邊界一定大於等於最後一個位置,否則就無法跳到最後一個位置了。如果訪問最後一個元素,在邊界正好爲最後一個位置的情況下,我們會增加一次「不必要的跳躍次數」,因此我們不必訪問最後一個元素。

 

基於上述官方解答,以下爲自己理解:

 

1. 每一次跳躍時更新能到達的最遠距離;

2. 當前索引與邊界相等時,纔會必須跳躍一次;【跳躍點和維護的邊界點(記錄跳躍次數的點)並不一致,但是兩者的總次數是相等的】

下圖中紅框中爲 “維護的邊界點”,藍筐中對應的爲 “跳躍點”

(1) index=0時,跳躍的最遠距離爲index=2,此爲邊界點;到達的index=1,2。index=1,2沒有到達最終點,所以必須得跳一次。當index=2時,即到達了第一次index=0跳躍時的邊界點,這時已經統計出了index=1時跳的最遠,最遠可以跳到index=4。

(2) index=1,2時,跳躍的最遠距離爲index=4,此爲邊界點;到達的index=2,3,4。

(3) index=2,3,4時,跳躍的最遠距離爲index=4+4;到達的index=5,6。

 

class Solution:
    def jump(self, nums: List[int]) -> int:

        steps = 0
        max_distance = 0
        end_distance = 0

        for i in range(len(nums)-1):
            max_distance = max(max_distance, nums[i]+i)

            if i == end_distance:
                end_distance = max_distance
                steps += 1

        return steps

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章