45. 跳跃游戏 II(最值型动态规划)

这篇博客介绍了如何解决LeetCode上的跳跃游戏II问题,利用动态规划方法找到到达数组最后一个位置所需的最小跳跃次数。给定一个非负整数数组,从初始位置开始,每次跳跃的最大长度由数组元素决定,目标是用最少的跳跃次数达到数组末尾。博客通过示例代码详细阐述了状态转移方程和算法实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* 45. 跳跃游戏 II
* 给定一个非负整数数组,你最初位于数组的第一个位置。
  数组中的每个元素代表你在该位置可以跳跃的最大长度。
  你的目标是使用最少的跳跃次数到达数组的最后一个位置。

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        if(n == 0){
            return 0;
        }
        // 确定状态,f[X]跳到台阶X需要多少次
        // 最后一步,台阶X可由之前台阶j(j<X)跳到
        // 子问题,f[j]跳到台阶j最少需要多少次
        int[] f = new int[n];
        // 初始位置在0,因此f[0]不需要跳跃
        f[0] = 0;
        
        // 通过转移方程,求解f[1]到f[n-1]
        for(int i = 1; i < n; i++){
            // 初始情况将f[i]设置为不可达的状态,也就是最大值
            f[i] = Integer.MAX_VALUE;
            
            for(int j = 0; j < i; j++){
                // 列举出所有满足条件的子问题,进而通过状态转移来求解更大的子问题
                if(f[j] != Integer.MAX_VALUE && (i - j) <= nums[j]){
                    f[i] = Math.min(f[i], f[j] + 1);   
                }
            }
        }
        return f[n-1];
    }
}
### 跳跃游戏 II算法实现 跳跃游戏 II 是一道经典的贪心算法问题,目标是从数组的第一个位置跳到后一个位置,并返回最少跳跃次数。以下是基于 Go 语言的解决方案。 #### 算法思路 该问题可以通过维护当前能够覆盖的大范围来解决。每次当遍历的位置达到上一次记录的大边界时,更新大边界并增加跳跃次数[^1]。这种方法的核心在于利用局部优解(即每一步尽可能远地跳跃)来获得全局优解。 #### 实现代码 (Go) ```go package main import ( "fmt" ) func jump(nums []int) int { if len(nums) <= 1 { return 0 } jumps := 0 // 记录跳跃次数 currentEnd := 0 // 当前区间的右端 farthest := 0 // 可以到达的远距离 for i := 0; i < len(nums)-1; i++ { // 更新能到达的远距离 if nums[i]+i > farthest { farthest = nums[i] + i } // 到达当前区间边界时触发跳跃 if i == currentEnd { jumps++ currentEnd = farthest // 如果已经可以到达终点,则提前结束循环 if currentEnd >= len(nums)-1 { break } } } return jumps } func main() { nums := []int{2, 3, 1, 1, 4} // 测试数据 fmt.Println(jump(nums)) // 输出跳跃次数 } ``` 上述代码通过 `jumps` 来计数跳跃次数,`currentEnd` 表示当前步所能到达的远索引,而 `farthest` 则表示下一步可能到达的远索引。每当遍历到 `currentEnd` 时,就执行一次跳跃操作并将新的边界设置为 `farthest`。 #### 复杂度分析 - **时间复杂度**: O(n),其中 n 是输入数组的长度。因为只需要遍历整个数组一次。 - **空间复杂度**: O(1),仅使用了常量级额外存储空间。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值