跳跃游戏 II | 贪心算法最优解(最少跳跃次数)

跳跃游戏 II | 贪心算法最优解(最少跳跃次数)

题目描述

给定一个长度为 n 的 0 索引整数数组 nums,初始位置为数组下标 0。数组中每个元素 nums[i] 表示从下标 i 处可以向前跳跃的最大长度,即若处于索引 i,可跳跃到任意满足 i < j < n 且 j ≤ i + nums[i] 的索引 j。要求返回到达数组最后一个下标 n-1 的最小跳跃次数,题目保证一定可以到达最后一个下标。

核心特征分析

  1. 数组类问题的算法选择优先级:贪心算法 > 动态规划(尤其当问题仅需"最优结果"而非"所有路径"时);
  2. 本题中"每个元素代表可跳跃的最大长度"是贪心算法的典型适配场景------无需记录所有跳跃路径,只需通过"局部最优选择"即可推导"全局最优解"(最少跳跃次数)。

算法选择与思路

算法选择

选择贪心算法作为最优解,核心原因如下:

  • 动态规划需维护数组记录每个位置的最少步数,时间复杂度 O(n2)O(n^2)O(n2)、空间复杂度 O(n)O(n)O(n),效率较低;
  • 贪心算法仅需常数级变量记录关键状态,时间复杂度 O(n)O(n)O(n)、空间复杂度 O(1)O(1)O(1),且能直接推导最少跳跃次数,是本题的最优解法。

贪心算法核心思路

关键变量定义
  • step:记录已完成的跳跃次数;
  • current:当前跳跃范围内能到达的最远边界(即本次跳跃的"终点");
  • max_length:遍历过程中能到达的全局最远索引(所有可达位置中能跳的最远位置)。
算法执行步骤
  1. 初始化 step = 0、current = 0、max_length = 0(补充边界处理:若数组长度≤1,无需跳跃,直接返回0);
  2. 遍历数组中的每个索引 i:
    • 刷新全局最远可达索引:max_length = max(max_length, i + nums[i]);
    • 若 i == current(遍历到当前跳跃的边界),说明必须完成一次跳跃:
      ① 跳跃次数加1:step++;
      ② 更新下一次跳跃的边界:current = max_length;
    • 若 current ≥ n-1(当前边界已覆盖最后一个下标),提前终止遍历(无需继续计算);
  3. 遍历结束后返回 step。

完整解题代码

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        // 边界处理:数组长度≤1时,初始位置即为终点,无需跳跃
        if (n <= 1) return 0;
        
        int step = 0;          // 最少跳跃次数
        int current = 0;       // 当前跳跃的最远边界
        int max_length = 0;    // 全局能到达的最远索引
        
        for (int i = 0; i < n; i++) {
            // 更新全局最远可达位置
            max_length = max(max_length, i + nums[i]);
            
            // 到达当前跳跃边界,必须完成一次跳跃
            if (current == i) {
                step++;
                current = max_length;
            }
            
            // 提前终止:已能到达最后一个下标,无需继续遍历
            if (current >= n - 1) break;
        }
        return step;
    }
};

复杂度分析

  • 时间复杂度 :O(n)O(n)O(n)。仅需遍历一次数组,n 为数组长度,遍历过程中所有操作均为常数级;
  • 空间复杂度 :O(1)O(1)O(1)。仅使用 step、current、max_length 三个常数级变量,无额外空间开销。

总结

  1. 贪心算法解决"跳跃游戏 II"的核心是以"当前跳跃边界"为触发条件,每到边界就完成一次跳跃,并将下一次边界更新为全局最远可达位置;
  2. 该解法通过"局部最优(每次跳最远)"实现"全局最优(最少次数)",时间/空间复杂度均为最优;
  3. 边界场景处理(如数组长度≤1)是保证代码健壮性的关键,需结合题目条件补充。
相关推荐
强哥聊算力10 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
Navigator_Z13 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy14 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
YangYang9YangYan15 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl215 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风15 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技15 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
171320330计算机毕设编程17 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
姜鱼问生17 小时前
Nginx gzip 压缩:一个配置让页面加载快 3 倍
后端·算法·架构