LeetCode 跳跃游戏 II 最优解法:贪心算法

在刷LeetCode的过程中,跳跃游戏 II(Jump Game II) 是一道经典的贪心算法题目,要求我们以最少的跳跃次数到达数组的最后一个位置。这篇文章将详细讲解如何用贪心思想高效解决这个问题,全程使用Java代码实现,思路清晰且时间复杂度最优。

题目回顾

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

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

解题思路:贪心算法

核心思想是每一步都选择能跳得最远的位置,从而最小化跳跃次数。我们通过三个关键变量来实现这个思路:

  • mx:记录当前位置能够到达的最远位置
  • last:记录上一次跳跃后到达的边界位置(即上一次跳跃的终点);
  • ans:记录跳跃的总次数。

具体执行步骤:

  1. 遍历数组的前 n-2 个位置(因为到达倒数第二个位置时,最后一次跳跃必然能到终点);
  2. 对每个位置 i,计算 i + nums[i](当前位置能跳到的最远位置),并更新 mx 为全局最大值;
  3. 当遍历到 last(上一次跳跃的边界)时,说明需要进行一次新的跳跃:
    • last 更新为当前能到达的最远位置 mx
    • 跳跃次数 ans 加 1;
  4. 遍历结束后,ans 即为最少跳跃次数。

Java代码实现:

java 复制代码
class Solution {
    public int jump(int[] nums) {
        // 边界处理:数组长度为1时,无需跳跃
        if (nums == null || nums.length <= 1) {
            return 0;
        }
        
        int n = nums.length;
        int mx = 0;    // 当前能到达的最远位置
        int last = 0;  // 上一次跳跃的边界位置
        int ans = 0;   // 跳跃次数
        
        // 遍历到n-2即可,因为到n-1已经是终点,无需再跳
        for (int i = 0; i < n - 1; i++) {
            // 更新当前能到达的最远位置
            mx = Math.max(mx, i + nums[i]);
            
            // 到达上一次跳跃的边界,需要跳一次
            if (i == last) {
                last = mx;  // 新的边界是当前能到达的最远位置
                ans++;      // 跳跃次数+1
                
                // 提前终止:如果当前最远位置已经能到终点,无需继续遍历
                if (mx >= n - 1) {
                    break;
                }
            }
        }
        
        return ans;
    }
}

代码解析

  1. 边界处理:如果数组长度小于等于 1,直接返回 0(起点就是终点,无需跳跃);
  2. 变量初始化mx 初始为 0(初始能到达的最远位置),last 初始为 0(初始跳跃边界是起点),ans 初始为 0(初始跳跃次数);
  3. 核心遍历
    • 遍历范围是 [0, n-2],因为当 i = n-1 时已经到达终点,无需处理;
    • 每次计算 i + nums[i] 并更新 mx,确保 mx 始终是当前能到达的最远位置;
    • i 到达上一次跳跃的边界 last 时,说明必须跳一次:更新 last 为新的最远边界 mx,并增加跳跃次数;
  4. 提前终止优化 :如果 mx 已经能覆盖到数组最后一个位置,直接跳出循环,减少不必要的遍历。

复杂度分析

  • 时间复杂度O(n),仅需遍历数组一次,每个元素最多被访问一次;
  • 空间复杂度O(1),仅使用了常数个变量,没有额外的空间开销。

示例验证

nums = [2,3,1,1,4] 为例:

  • 初始:mx=0, last=0, ans=0
  • i=0mx = max(0, 0+2)=2i==last,更新 last=2ans=1
  • i=1mx = max(2, 1+3)=4i≠last
  • i=2mx = max(4, 2+1)=4i==last,更新 last=4ans=2;此时 mx=4 >= 4(数组最后一个位置),提前终止;
  • 最终返回 ans=2,符合预期。

总结

  1. 本题的核心是贪心策略:每一步都选择能跳得最远的位置,从而最小化跳跃次数;
  2. 通过 mx 记录最远可达位置、last 记录跳跃边界,能在一次遍历中完成计算,时间复杂度最优;
  3. Java 代码实现中加入了边界处理和提前终止优化,进一步提升了代码的健壮性和效率。
相关推荐
程序员-Benothing7 小时前
H3 Max开放世界RPG:AI原生游戏,从“能生成“到“能玩“差了多远
游戏·ai-native
Tisfy10 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
木井巳12 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
Navigator_Z13 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z14 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode
CoderYanger17 小时前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
无别05219 小时前
【做游戏】做完游戏Demo后没地方发布?
游戏·玩游戏
lilian23319 小时前
HarmonyOS 7 新特性(二十九)|游戏伴随服务:悬浮协作与质量降级
游戏·语音识别·harmonyos
sheeta199820 小时前
LeetCode 每日一题笔记 日期:2026.09.02 题目:3875.构造奇偶一致的数组 I
笔记·算法·leetcode
人民广场吃泡面20 小时前
DLSS 5 深度解析:当 AI 学会“创造”画面,实时游戏渲染迎来“GPT 时刻”
人工智能·gpt·游戏