给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
递归1
class Solution:
def canJump(self, nums: List[int]) -> bool:
if nums[0]+1>=len(nums):
return True
flag = False
for i in range(nums[0]):
if i+1==len(nums):
break
flag=flag or self.canJump(nums[i+1:])
return flag
这么做超时了
递归2
class Solution:
start=0
def canJump(self, nums: List[int]) -> bool:
if nums[0]+1 >= len(nums):
return True
max=0
for i in range(self.start,nums[0]+1):
if nums[max]+max<nums[i]+i:
max=i
if max==0:
return False
self.start=nums[0]-max+1
return self.canJump(nums[max:])
这么做超出内存限制了
迭代1
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums)==1 or nums[0]>=len(nums)-1:
return True
start=i=0
m=nums[0]
# m记录每次找到的最右边的位置
while True:
for j in range(i+1,i+nums[i]+1):
if j+nums[j]>m:
m=j+nums[j]
start=j
if m<=i+nums[i]:
return False
elif m>=len(nums)-1:
return True
else:
i=star
从左向右遍历,在i位置开始寻找,能够跳跃到最远位置的下一步,并把i变成那一步继续进行寻找
执行用时 :60 ms, 在所有 Python3 提交中击败了71.89%的用户
内存消耗 :15.1 MB, 在所有 Python3 提交中击败了5.41%的用户
迭代1-改
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums)==1 or nums[0]>=len(nums)-1:
return True
start=i=0
m=nums[0]
# m记录每次找到的最右边的位置
for i in range(len(nums)):
if i>m:
return False
m=max(m,i+nums[i])
return m>=len(nums)-1```
从左向右遍历整个列表,不断更新能够到达的最大位置。如果i超过了最大位置,就意味着到那里就断了。
执行用时 :48 ms, 在所有 Python3 提交中击败了88.65%的用户
内存消耗 :15 MB, 在所有 Python3 提交中击败了5.41%的用户
迭代2
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums)==1 or nums[0]>=len(nums)-1:
return True
right=len(nums)-1
cur=right-1
while cur>=0:
if cur+nums[cur]>=right:
right=cur
cur-=1
return right==0
从右往左遍历,查找能够跳跃到right的位置,并把right定为当前位置。如果能够跳跃到最右边,则一定存在一条路径使得right最终等于0
执行用时 :32 ms, 在所有 Python3 提交中击败了99.58%的用户
内存消耗 :15.1 MB, 在所有 Python3 提交中击败了5.41%的用户