LeetCode 45 - Jump Game II
題目
題目連結:https://leetcode.com/problems/jump-game-ii/submissions/
給一非負的整數序列,一開始在序列的第一格上。序列的值代表在此位置時最多可以跳多少距離,求最少幾步可以到達序列的最後一格。
範例說明
1 | Input: [2,3,1,1,4] |
想法
假設序列的第 i 個元素為 Ai,且序列從 0 開始編號。
在第 0 步的時候,假設 R0 = 0
,則可以到達的範圍在 0 ~ R0
。
第 1 步時,一步能到達的範圍在 0 ~ R1
,其中 R1 = A0
。但是從 0 ~ R0
的這個區間出發,必定只能到達 0 ~ R1
,所以要算出第 2 步能到達的範圍時,可以排除從 0 ~ R0
出發的可能性。因此第 2 步可以到達的範圍應該是由 [R0 + 1, R1]
出發:
假設聯集後的範圍在 [L2, R2]
,代表 [0 ~ R2]
都可以在 2 步內到達。但是從 0 ~ R1
這個區間出發,必定只能到達 0 ~ R2
,所以要算出第 3 步能到達的範圍時,可以排除從第 0 ~ R1
格出發的可能性,因此第 3 步可以到達的範圍應該是由 [R1 + 1, R2]
出發:
以此類推,可以發現要算第 i
步能到達的區間,只需要由 i - 1
步能多走到的區間出發計算就好。
假設 N
為序列長度,因為每一個區間都不重複,所以總時間複雜度為 O(N)
。
實作細節
紀錄 [iL, iR]
區間,代表要從這個區間出發找下一步可以到哪個範圍。steps
為當前的步數。
初始時,steps = 0
,且 [iL, iR] = [0, 0]
。
每一次都從 [iL, iR]
區間出發,尋找下一個 iR
,紀錄為 next_iR
:
而下一個 iL
則為 iR + 1
。
程式碼
1 | /** |