LeetCode 55. Jump Game
https://leetcode.com/problems/jump-game/
Medium
Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
Example 1:
Input: [2,3,1,1,4] Output: true Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
Example 2:
Input: [3,2,1,0,4] Output: false Explanation: You will always arrive at index 3 no matter what. Its maximum jump length is 0, which makes it impossible to reach the last index.
- DP / Greedy.
- 动规。定义f[i]为i位置最大能jump到的index,f[i] = max{ f[i - 1], i + nums[i] }, f[0] = nums[0],f[n]为所求结果。中间注意可以剪枝。
- 贪心。从后往前倒推,如果当前位置能跳到lastpos,则更新lastpos为i。最后判断lastpos是否为0。若是则代表能从头跳到尾。
- https://leetcode.com/problems/jump-game/solution/
- https://leetcode.com/problems/jump-game/discuss/114802/Python-DP-O(n)-solution-accepted
1 class Solution: 2 def canJump1(self, nums: List[int]) -> bool: 3 lastpos = len(nums) - 1 4 5 for i in range(len(nums) - 1, -1, -1): 6 if i + nums[i] >= lastpos: 7 lastpos = i 8 9 return lastpos == 0 10 11 def canJump(self, nums: List[int]) -> bool: 12 f = [0] * len(nums) 13 f[0] = nums[0] 14 15 for i in range(1, len(nums)): 16 if f[i - 1] < i: 17 return False 18 19 f[i] = max(f[i - 1], i + nums[i]) 20 21 return f[-1] >= len(nums) - 1