45. 跳跃游戏 II

2024-02-11 11:52:02 浏览数 (1)

link

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

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

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

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

 Example 1:

代码语言:javascript复制
Input: nums = [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2. Jump 1 step from index 0 to 1, then 3 steps to the last index.
代码语言:javascript复制
func jump(nums []int) int {
    // 动态规划四步走:
    // 1、状态:f[i] 表示从起点到当前位置跳的最小次数
    // 2、推导:f[i] = min(f[j] 1),a[j])  j >=i 表示从j位置用一步跳到当前位置,这个j位置可能有多个,取最小的一个就行
    // 3、初始化:f[0] = 0
    // 4、结果:f[n-1]
    f := make([]int, len(nums))
    f[0] = 0
    for i := 1; i < len(nums); i   {
        // f[i] 先取一个默认最大值i
        f[i] = i
        // 遍历之前结果取一个最小值 1
        for j := 0; j < i; j   {
            if nums[j] j >= i {
                f[i] = min(f[j] 1,f[i])
            }
        }
    }
    return f[len(nums)-1]
}

func min(a, b int) int {
    if a > b {
        return b
    }
    return a
}

贪心

设每次所选的起跳位置为start,

能到的最大距离end为i nums[start],

我们为了能用最小的次数跳到终点,每次都想跳到最大的位置为max。

跳的次数为count

为了保证count最小,所以每次跳都要这一跳能跳的最远位置,解题思路应为贪心算法。从前向后遍历,

每完成一次跳跃后更新count与end的值,下一次的i即从上一跳的最远处end_{i-1}(=start_i)endi−1(=starti)开始计算,

遍历位置start_istarti到end_iendi得到能跳的最远处max,然后当遍历到end_iendi时,更新下一跳的起点start_{i 1}starti 1为max

代码语言:javascript复制
func jump(nums []int) int {
    if nums == nil || len(nums) == 0{
        return -1
    }
    
    n := len(nums)
    count,max,end := 0,0,0
    for i:=0;i<n-1;i  {
        
        // 记录每一个位置i所能跳到的最大位置max
        if i nums[i]>max{
            max = i nums[i]
        }
        // end是上一个所选的起跳位置能跳的最远处,当到达end时,更新下一跳的最大位置
        if i == end{
            end = max
            count  
        }
    }
    return count
}

0 人点赞