又是一种类型的动态规划了,还是要尽量找到通解状态,然后再去写递归方程,最后通过边界值来进行递推
【跳跃游戏的精髓是】:
在任意一个位置(指针)k处,若想到达该位置k,那么k之前所有指针可以到达的最大位置的集合的max>=k,即,可以跳到任意位置的通解的数学表达式为:
Max(i+nums[i])>=k,其中i+nums[i]为某位置可以跳到的最大位置
#法1
class Solution:
def canJump(self, nums: List[int]) -> bool:
n=len(nums)
#初始化loc,指针位于0处
loc=0
for i in range(n):
#如果当前指针位置<目前为止所有已经更新的位置可以跳到的最大位置时,重复循环更新最大位置
if i<=loc:
#loc=i+nums[i]
#不断更新可以跳到最远的位置
loc=max(loc,i+nums[i])
#当可以跳到最远的位置超出边界时,即可以到达【提前判断加快效率】
if loc>=n-1:
return True
#如果当前指针位置>目前位置所有已经更新位置可以跳到的最大位置,那么说明永远到不了该指针位置,则跳出
else:
return False
法2:
class Solution:
def canJump(self, nums: List[int]) -> bool:
n=len(nums)
if n==1:
return True
#if n==2:
#if 1<=nums[0]:
# return True
#i=0
dmax=0
for i in range(n):
#当i在之前索引可以跳到的最大值范围里时,不断更新最大值
if i<=dmax:
d=i+nums[i]
dmax=max(d,dmax)
#i大于之前可以跳到的最大位置了,意味着断点
else:
return False
#无断点情况下,最大值大于n-1,那么肯定能跳到
return dmax>=n-1