题目:
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
思路:
以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点。
解答:
方法一:贪心
class Solution:
def jump(self, nums: List[int]) -> int:
cur_cover=0
next_cover=0
res=0
n=len(nums)
for i in range(n):
next_cover=max(i+nums[i],next_cover)
#下标到达当前覆盖的最远距离
if i==cur_cover:
#如果当前覆盖最远距离下标不是集合终点,步数就加一,还需要继续走。
if cur_cover!=n-1:
res+=1
cur_cover=next_cover
if next_cover>=n-1:
break
#如果当前覆盖最远距离下标就是集合终点,步数不用加一,因为不能再往后走了。
else:
break
return res
方法二:精简版
class Solution:
def jump(self, nums: List[int]) -> int:
cur_cover=0
next_cover=0
res=0
n=len(nums)
for i in range(n-1):
next_cover=max(i+nums[i],next_cover)
#下标到达当前覆盖的最远距离
if i==cur_cover:
res+=1
cur_cover=next_cover
return res