题目描述:
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
解题思路:
这道题我们仍旧不管它的跳法如何,仍旧从当前的覆盖范围来看。从求局部最优达到全局最优的角度考虑,在当前步的覆盖范围没有达到整个数组的最后一个下标时,跳跃数+1,进行下次跳跃,进行下次跳跃后,若达到数组末尾下标,跳跃数计算结束,否则,继续跳跃。
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0
if len(nums)==1: retuen count
cur_cover = 0
next_cover = 0
for i in range(len(nums)):
next_cover = max(i+nums[i], next_cover)
###在当前步的覆盖范围没走完之前,它的下一步覆盖范围为当前步覆盖范围内所有位置能取到的覆盖范围的最大值,体现了局部最优的思想。
if i == cur_cover:
###注意已经走到当前步的最大覆盖范围,此时将更新当前步的最大覆盖范围
cout+=1
cur_cover = next_cover
###完成更新,走到下一步,当前覆盖范围为最新的最大覆盖范围
if cur_cover >=len(nums)-1:break
return count