跳转至

45. 跳跃游戏 II

题目

给定一个长度为n0 索引整数数组nums。初始位置为nums[0]

每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i + j]处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达nums[n - 1]的最小跳跃次数。生成的测试用例可以到达nums[n - 1]

示例 1:

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

输出: 2

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

示例 2:

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

输出: 2

复杂度

  • 时间复杂度: \(O(n)\),其中 \(n\)\(nums\) 的长度。
  • 空间复杂度: \(O(1)\)

题解

Go
func jump(nums []int) (ans int) {
    curRight := 0  // 已建造的桥的右端点
    nextRight := 0 // 下一座桥的右端点的最大值
    for i, num := range nums[:len(nums)-1] {
        nextRight = max(nextRight, i+num)
        if i == curRight { // 到达已建造的桥的右端点
            curRight = nextRight // 造一座桥
            ans++
        }
    }
    return
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}
Python
class Solution:
    def jump(self, nums: List[int]) -> int:
        ans = 0
        cur_right = 0  # 已建造的桥的右端点
        next_right = 0  # 下一座桥的右端点的最大值
        for i in range(len(nums) - 1):
            next_right = max(next_right, i + nums[i])
            if i == cur_right:  # 到达已建造的桥的右端点
                cur_right = next_right  # 造一座桥
                ans += 1
        return ans

参考