---
# System prepended metadata

title: Leetcode 45. Jump game II
tags: [Leetcode, Array, Greedy]

---

## Solution

### Greedy + DP

```python!
class Solution:
    def jump(self, nums: List[int]) -> int:
        # Time complexity: O(n)
        # Space complexity: O(n)
        #  0 1 2 3 4
        # [2,3,1,1,4]
        # [2,4,4,4,8]
        output = 0
        n = len(nums)
        for i in range(1,n):
            nums[i] = max(nums[i] + i,nums[i-1])
        i = 0
        while i < n - 1:
            output += 1
            i = nums[i]
        return output
```

```python=
class Solution:
    def jump(self, nums: List[int]) -> int:
        # 在上次能跳最遠的地方，選擇一個能跳最遠的位置即可
        end = maxPos = ans = 0
        # 一路考慮跳躍路徑到終點，也就是 n - 1 (題目有說)
        for i in range(len(nums) - 1):
            # 篩選出最大跳躍點 
            # i + nums[i] 等同於計算出從當前位置跳躍到其他下標的索引
            maxPos = max(nums[i] + i,maxPos)
            # 等到把所有能跳格子都考慮完了以後，才跳躍
            if i == end:
                end = maxPos # 更新跳躍點
                ans += 1 # 更新跳躍次數
        return ans
```

## Complexity

- Time complexity: O(n)
- Space complexity: O(1)