55
思路一
一次遍历,当前数和指标相加,遍历的时候取最大值,将最大值与下一次的指标作比较,小的话直接返回False,遍历完成的话就输出True。
代码
class Solution:
def canJump(self, nums: List[int]) -> bool:
#注意判断特殊情况
if not nums or len(nums) == 1:return True
max_dist = 0
for i in range(len(nums)):
if max_dist > len(nums)-1: #大于最后一位的说明直接满足要求,返回True
return True
if max_dist < i: #前一位置的最大可达位置小于当前位置,说明跳不过去,直接return False
return False
max_dist = max(max_dist,i+nums[i]) #每次更新最大可达位置
return True
思路二
从后往前一直取能到达终点的下标,最后看0不能取,取0说明能够跳完。
代码
class Solution:
def canJump(self, nums: List[int]) -> bool:
if not nums or len(nums) == 1:return True
#首先将target设置为最后一位
target = len(nums)-1
for i in range(len(nums)-2,-1,-1):
#如果当前位置+步数大于等于target位(即能跳过),则把target更新为当前位
if nums[i] + i >= target:
target = i
return target == 0
45
class Solution:
def jump(self, nums: List[int]) -> int:
n = len(nums)
last, cur = 0, 0
res = 0
for i in range(n):
# 如果当前位置超出了上一步能跳的最远范围,就需要更新last,并且跳一次
if i > last:
last = cur
res += 1
if cur >= n - 1:
break
cur = max(cur, i + nums[i])
return res