class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums)==1:#只有一个是可以到达的。
return True
cover=0
i=0
while i<=cover:#因为cover是动态变化的,for不支持,所以改用while
cover=max(i+nums[i],cover)
if cover>=len(nums)-1:
return True
i+=1
return False
'''这道题的贪心算法精髓在于,我们不需要知道每次到底走几步,我们只需要知道,最终我们的覆盖范围
到底能不能覆盖到最后一位。每次的覆盖范围为cover,那么在cover范围内,我们有不同的选择,分别继续往后走。
那么能到达的最远位置是i+nums[i]与原cover取max,如此循环操作后,如果我们能覆盖到最后一个数的索引len-1,
那么就说明我们可以走到当把所有可能性遍历完毕,仍然没有合适的,就说明不存在。'''
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums)==1:
return 0
curcover=0#当前能到达的最远位置
nextcover=0#下一步能到达的最远位置
step=0#记录步数
for i in range(len(nums)):
nextcover = max(i + nums[i], nextcover)#在当前能到达的位置内,选择下一步能到达的最远位置。
if i==curcover:#表示已经到达当前能到达的最远位置。
if curcover<len(nums)-1:#如果当前能到达的最远位置并没有到达最后,就要走下一步,步数+1
step+=1
curcover=nextcover#让下一步变为当前步
if nextcover>=len(nums)-1:#如果当下一步的最远位置已经比最后一个点要大,退出。
break#为什么会退出呢,因为下一轮循环的时候cur=next>=len-1,step不会+1了。所以是正好的。
return step
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums)==1:
return 0
curcover=0
cnt=0
nextcover=0
i=0
while i<=len(nums)-2:
nextcover=max(i+nums[i],nextcover)
if i==curcover:
cnt+=1
curcover=nextcover
i+=1
return cnt
第二种方法把讨论情况都放在一起。因为无论如何都会到达,所以只需要cover能到达len(nums)-2的位置就可以了。