题目
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。
例:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
方法
贪心算法的思路就是通过局部最优推出整体最优,应用到该题中就是,每一步尽可能多走,从而实现最小步数
- curCover 表示这一步的最大覆盖范围,nextCover 表示下一步的最大覆盖范围,count 表示步数
- 若 nums 数组只有一个元素,那么步数为零
- 若 nums 数组含有多个元素,循环遍历数组。首先,更新 nextCover。若下标到达这一步的覆盖的最远处 curCover,那么此时需要再次判断该点是否为数组的终点,若并未到达数组的终点,那么步数加一,并且将下一步的最大覆盖范围赋值给这一步的最大覆盖范围。并且判断下一步的最大覆盖范围是否覆盖到数组的末尾,若覆盖到,则结束循环,输出步数
class Solution(object):
def jump(self, nums):
curCover, nextCover = 0, 0
count = 0
if len(nums) == 1:
return 0
for i in range(len(nums)):
nextCover = max(nextCover, i + nums[i])
if i == curCover:
if curCover != len(nums) - 1:
count += 1
curCover = nextCover
if nextCover >= len(nums) - 1:
break
return count
参考
代码相关:https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html