45. 跳跃游戏 II

举报
Rolle 发表于 2024/02/19 18:47:55 2024/02/19
【摘要】 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]。 Exa...

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:

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.
复制
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

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
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。