1. 程式人生 > >LeetCode 45. 跳躍遊戲 II | Python

LeetCode 45. 跳躍遊戲 II | Python

### 45. 跳躍遊戲 II --- 題目來源:[https://leetcode-cn.com/problems/jump-game-ii](https://leetcode-cn.com/problems/jump-game-ii) #### 題目 --- 給定一個非負整數陣列,你最初位於陣列的第一個位置。 陣列中的每個元素代表你在該位置可以跳躍的最大長度。 你的目標是使用最少的跳躍次數到達陣列的最後一個位置。 **示例:** ```bash 輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最後一個位置的最小跳躍數是 2。 從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後一個位置。 ``` **說明:** - 假設你總是可以到達陣列的最後一個位置。 #### 解題思路 --- **思路:貪婪演算法** 首先,先注意題意的**說明**部分【**假設你總是可以到達陣列的最後一個位置**】。這裡只需要考慮,題目中所給出的陣列,是一定能夠到達陣列的最後一個位置。 這題要求與之前 [55. 跳躍遊戲](https://blog.csdn.net/weixin_45642918/article/details/105585796) 並不相同,55 題要求的返回是否能夠到達最後一個位置。如果用 55 題的反例來論證本題意義不大,若覺得有必要,也可以在無法到達時返回特定的值用以標記,例如 0。 現在考慮如何去求得到達最後位置的最小跳躍次數? 在這裡,我們考慮使用正向去找可到達的最遠位置。這裡以示例 1 為例,[2,3,1,1,4],索引為 0 的位置,這裡元素值為 2,表示該位置能夠跳躍到達的位置為後續兩個位置,如下圖所示紅色部分: ![示例 1 | 圖 1](https://img2020.cnblogs.com/other/2016405/202005/2016405-20200504163426046-1979072778.png) 在這裡,索引為 1 的位置中,元素值值為 3,表示能夠後續三個位置,能到達最遠的位置為索引 4,這裡已經到達末尾位置。而索引 2 的位置中,值為 1,這裡只能跳躍到索引為 3 的位置。這裡顯然從索引 1 的位置跳躍能到達更遠的位置。 假設陣列後續還未到達末尾,,現在選擇先跳到索引 1 的位置,上面說能夠在該位置能跳躍到後續三個位置,這裡如何選擇落腳的地方?跟上面討論的一樣,在每個可到達的位置,判斷各自能夠跳躍的最遠的位置。 現在位置在索引 1 的位置上面,如下圖所示,3 個紅色部分就是索引 1 這個位置能夠跳躍的選擇,而跳到索引 4 的位置,能夠跳躍更遠的位置,所以此處是當前最好的落腳點。 ![示例 | 圖 2](https://img2020.cnblogs.com/other/2016405/202005/2016405-20200504163426293-1631854087.png) 現在考慮如何實現?我們可以維護這個可到達的最遠位置,作為邊界。當我們正向遍歷的時候,當到達邊界時,就更新這個邊界,相應的跳躍次數加 1。 這裡需要注意一點,我們從正向遍歷的時候,不用遍歷最後一個位置。根據上面的說明知道,這裡一定會到達最後一個位置。那麼前面所述的需要維護的這個邊界,一定是大於或等於最後那個位置的。如果邊界剛好就在最後的位置時,按照前所述的到達邊界時,更新邊界,跳躍次數加 1 的邏輯,這裡會增加不必要的跳躍次數。所以不考慮訪問這個最後的位置。 具體的程式碼實現如下。 #### 程式碼實現 --- ```python class Solution: def jump(self, nums: List[int]) -> int: # 定義最遠位置,邊界,步數 max_pos = 0 end = 0 steps = 0 for i in range(len(nums) - 1): # 獲取最遠可到達位置 max_pos = max(max_pos, i + nums[i]) # 到達邊界時,更新邊界 # 同時跳躍次數加 1 if i == end: end = max_pos steps += 1 return steps ``` #### 實現結果 --- ![實現結果](https://img2020.cnblogs.com/other/2016405/202005/2016405-20200504163426575-1801827583.png) --- > 以上就是使用貪心演算法,從陣列開始正向遍歷,維護可跳躍最遠的位置,確定邊界,到達邊界時,更新邊界,增加跳躍次數,進而解決《45. 跳躍遊戲 II》問題的主要內容。 --- > 歡迎關注微信公眾號《書所