文章目录

  • 一、题目描述
  • 示例 1
  • 示例 2
  • 二、代码
  • 三、解题思路



一、题目描述

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

示例 1

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2

输入: nums = [2,3,0,1,4]
输出: 2

提示: 1 <= nums.length <= 104 0 <= nums[i] <= 1000 `

二、代码

代码如下:

class Solution:
    def jump(self, nums: List[int]) -> int:
        def toJump(start,count,a):
            if start+1+a[start] >= len(a):
                count[0] = count[0] + 1
                print("count:",count)
            else:
                
                b = a[start + 1 : start+1+a[start]].copy()
                max_lengtg_index = 0
                for i in range(len(b)):
                    if max_lengtg_index <= a[start+1+i] + start+1+i:
                        max_lengtg_index = a[start+1+i] + start+1+i 
                        max_index = start+1+i
                count[0] = count[0] + 1
                start = max_index
                b.clear()
                toJump(start,count,a)
        count = [0]
        toJump(0,count,nums)
        if len(nums) == 1 :
            return 0
        else:
            return count[0]

三、解题思路

本题的题意是从一个数组第一个元素开始,判断最少走多少步能到达数组末尾,而走步的长度限制为当前位置数组的值:
例如 :nums = [9,8,2,2,0,2,2,0,4,1,5,7,9,6,6,0,6,5,0,5] 数组,从下标 0 开始向数组末尾移动,此时的位置为0,对应走步的长度限制在nums[0] = 9范围内,意思是下一个落脚点可能为[9,8,2,2,0,2,2,0,4,1,5,7,9,6,6,0,6,5,0,5] 这9个数中的其中一个。我们要做的就是不断选择一个“落脚点”使走步次数尽可能少的走到终点。
本题思路是每次都计算当前位置的下一个落脚点离终点最近的位置,以上面数组为例[9,8,2,2,0,2,2,0,4,1,5,7,9,6,6,0,6,5,0,5] ,当前的落脚点可能为8,2,2,0,2,2,0,4,1这9个点,依次计算——如果选择该落脚点后可达到的最长下标是多少,然后选择结果最大的作为下一个落脚点。
例如:
计算第一个8这个数作为落脚点时的最长下标,那么他能达到的最远距离下标为:当前对应的下标 + 当前值 = 1 + 8 = 9(index + nums[index])
但得出的结果并不是最大的,在我们遍历完这9个点后,发现最大的值是选择4这个点:8 + 4 = 12
所以此时我们选择当前4这个点的下标(index = 8)作为下一个落脚点,count值加1(count用于记录走了多少步),然后再次调用方法循环,直到计算距离大于等于nums的长度,此时输出count即可。