45. 跳跃游戏 II Python


一、题目描述

给你一个非负整数数组 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即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值