# **Leetcode筆記(Jump Game)**
:::info
:information_source: 題目 : Jump Game, 類型 : dynamic programming , 等級 : medium
日期 : 2023/04/24,2023/06/13,2023/09/29,2023/12/09
:::
### 嘗試
出現錯誤
RecursionError: maximum recursion depth exceeded while calling a Python object
搞錯題目,是只要小於該數字的步數都可以跳
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
tmp = 0
def dfs(tmp):
if tmp >= len(nums):
return False
tmp = tmp + nums[tmp]
if tmp == len(nums) - 1:
return True
dfs(tmp)
return dfs(0)
```
2023/06/13
dp[i]的意義為可否到達離自己最近的True
從後面開始想,初始化將最後一個dp標示為True
只要a[i]的步數 大於 其與最近True的距離,那就代表可以跳到該True
如果最後dp[0]為True,那就是可從第一位走到最後一位
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
l = len(nums)
dp = [False] * l
# 最後一個初始化
last = l - 1
dp[last] = True
for i in range(l - 2, -1, -1):
if nums[i] >= last - i:
dp[i] = True
last = i
return dp[0]
```
2023/07/22
如果左右兩個index之間的距離,小於nums[左邊index]的數值,那就代表可以成功跳過去
如果可以成功跳過去,就要更新右邊index,因為此時目標已經改變
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums) == 1:
return True
_len = len(nums)
target = _len - 1
for i in range(_len - 2, -1, -1):
if nums[i] >= target - i:
target = i
if target == 0:
return True
return False
```
2023/09/29
自創dp,從前面開始跳
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
l = len(nums)
dp = [False] * l
dp[0] = True
for i, n in enumerate(nums):
if dp[i]:
for j in range(1, n + 1):
if i + j < l:
dp[i + j] = True
if dp[l - 1]:
return True
return False
```
2023/12/09
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
dp = [False] * len(nums)
dp[0] = True
# nums = [2,3,1,1,4]
for i, n in enumerate(nums):
if dp[-1]:
return True
if dp[i]:
for j in range(1, n + 1):
if i + j < len(nums):
dp[i + j] = True
return False
```
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
goal = len(nums) - 1
for i in range(len(nums) - 2, -1, -1):
if i + nums[i] >= goal:
goal = i
if goal == 0:
return True
return False
```
---
### **優化**
所谓贪心算法,就是在行动的时候,最大化当前的一步收益。举个下山的例子:选择当前下降程度最高的方向,作为下降的选择,即尽可能地在当前这一步下降最多的高度。
在本题中,我们需要找出当前数字的最远可达位置。
最远可达位置:index + value,当前的位置 + 能跳跃的步数;
時間複雜度O(n),空間複雜度O(1)
```python
class Solution:
def canJump(self, nums: List[int]) -> bool:
goal = len(nums) - 1
# 如果len為5 那就是從3看
for i in range(len(nums) - 2, -1, -1):
# 大於也可以 代表跳少一點
if i + nums[i] >= goal:
# 通過代表一定達到目標
# 更新目標
goal = i
if goal == 0:
return True
else:
return False
```
---
**:warning: 錯誤語法**
:::warning
:::
**:thumbsup:學習**
:::success
:::
**思路**

**講解連結**
https://www.youtube.com/watch?v=Yan0cv2cLy8&ab_channel=NeetCode
Provided by. NeetCode
###### tags: `dynamic programming` `medium` `leetcode`