欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

45:跳跃游戏II

程序员文章站 2022-03-17 20:51:23
...

问题描述

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

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

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

示例

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

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

思路

这题目依旧是用贪心来做,只不过比跳跃游戏要难一点。 因为跳跃问题只要求我们解决是否可达的问题,这个要我们解决最少跳跃次数问题。
如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都 可以叫做第 2 次 跳跃。
所以,当一次 跳跃 结束时,从下一个格子开始,到现在 能跳到最远的距离,都 是下一次 跳跃 的 起跳点。

  1. 对每一次 跳跃 用 for 循环来模拟。
  2. 跳完一次之后,更新下一次 起跳点 的范围。
  3. 在新的范围内跳,更新 能跳到最远的距离。

记录 跳跃 次数,如果跳到了终点,就得到了结果。
45:跳跃游戏II
(方法一)

方法一的实现1:

class Solution:
    def jump(self, nums):
        res = 0
        leftIndex = 0
        rightIndex = 1
        while rightIndex < len(nums):
            maxPos = 0
            for i in range(leftIndex,rightIndex):
                maxPos = max(maxPos, i + nums[i])
            leftIndex = rightIndex
            rightIndex = maxPos+1
            res += 1
        return res

方法一的实践2

class Solution:
    def jump(self, nums):
        res = 0
        rightIndex = 0
        maxPos = 0
        for i in range(len(nums)-1):
            maxPos = max(maxPos, i+nums[i])
            if i == rightIndex: # 把上次的跳完了,更新
                rightIndex = maxPos
                res += 1
        return res