There are many solutions for these two problems. For Jump Game I, greedy is the best method, but we can also use DP to solve it.
Jump Game I
Solution 1 DP
There are two kind of DP solution, bottom-up and top-down. Reference: https://leetcode.com/problems/jump-game/solution/
Solution 2 Greedy
Special case: 023
If index<=reach is lost, this will return true.
class Solution(object)://slow
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
index=0
reach=0
while(index<len(nums)-1 and index<=reach):
reach=max(reach,index+nums[index])
index=index+1
if(reach<len(nums)-1):
return False
return True
class Solution(object)://fast
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
reach=len(nums)-1
for i in range(len(nums))[::-1]:
if nums[i]+i>=reach:
reach=i
if(reach==0):
return True
return False
Jump Game II
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
last=0
reach=0
jump=0
for i in range(len(nums)):
if last<i:
last=reach
jump+=1
reach=max(reach,nums[i]+i)
return jump