LeetCode Hot100(60/100)——55. 跳跃游戏

文章目录

一、题目背景与描述

题目链接:

https://leetcode.cn/problems/jump-game/

题目描述

给定一个非负整数数组 nums,你最初位于数组的第一个下标

数组中的每个元素代表你在该位置最多可以向前跳跃的步数

请判断你是否能够到达数组的最后一个下标


示例说明

示例 1:

text 复制代码
输入:nums = [2,3,1,1,4]
输出:true

解释:

  • 从下标 0 跳 1 步到下标 1
  • 从下标 1 跳 3 步到下标 4(终点)

示例 2:

text 复制代码
输入:nums = [3,2,1,0,4]
输出:false

解释:

  • 无论如何都会被卡在下标 3(最大跳跃为 0),无法继续前进

二、问题本质分析

这个问题本质是在问:

在每一步都有限制跳跃长度的情况下,能否通过合理选择跳跃位置,最终覆盖到数组的最后一个下标?

它具有以下特点:

  • 不要求最少步数
  • 只关心「是否能到达终点」
  • 每个位置的选择会影响后续的可达范围

三、解法一:贪心算法(推荐)

1. 核心思想

始终维护当前能到达的最远位置 maxReach

  • 从左到右遍历数组
  • 每到一个位置 i,如果 i > maxReach,说明当前位置无法到达,直接返回 false
  • 否则更新最远可达位置:
text 复制代码
maxReach = max(maxReach, i + nums[i])

只要在遍历过程中,maxReach 能覆盖到最后一个下标,就说明可以到达终点。


2. 贪心思维流程图(Mermaid)





开始:maxReach = 0
遍历数组 i 从 0 到 n-1
i > maxReach ?
返回 false
更新 maxReach = max(maxReach, i + numsi)
maxReach >= n-1 ?
返回 true


3. 为什么贪心是正确的?

  • 我们并不关心"从哪里跳",只关心"最远能跳到哪里"
  • 每一步选择当前能跳得最远的位置,一定不会比其他选择更差
  • 一旦出现某个位置不可达,后面的所有位置都不可达

4. Java 实现代码(贪心)

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int maxReach = 0;

        for (int i = 0; i < nums.length; i++) {
            // 如果当前位置已经无法到达
            if (i > maxReach) {
                return false;
            }
            // 更新最远可达位置
            maxReach = Math.max(maxReach, i + nums[i]);
        }
        return true;
    }
}

5. 复杂度分析

指标 复杂度
时间复杂度 O(n)
空间复杂度 O(1)

四、解法二:动态规划(理解用,不推荐)

1. 核心思想

定义一个布尔数组:

text 复制代码
dp[i] 表示:是否能够跳到位置 i

状态转移:

text 复制代码
dp[i] = 存在某个 j < i,使得 dp[j] == true 且 j + nums[j] >= i

2. 动态规划状态转移示意图

0
1
2
3
4

只要某个位置可以由前面任意一个可达位置跳到,就标记为 true


3. Java 实现代码(DP)

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length;
        boolean[] dp = new boolean[n];
        dp[0] = true;

        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (dp[j] && j + nums[j] >= i) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[n - 1];
    }
}

4. 复杂度分析

指标 复杂度
时间复杂度 O(n²)
空间复杂度 O(n)

5. 为什么不推荐?

  • 数据规模大时容易超时
  • 贪心算法能用更低的复杂度解决同样问题

五、两种解法对比总结

Jump Game
贪心算法
思路简单
一次遍历
O(n) 时间
面试首选
动态规划
思路直观
状态转移清晰
O(n²) 时间
不适合大规模


  • 不要纠结"怎么跳",只关注"能跳多远"
  • 一旦当前位置超过最远可达范围,直接失败
  • 贪心是该题的最优解法
相关推荐
倒头就睡的小比特17 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!17 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼18 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光19 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark19 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her119 小时前
并查集-听课笔记
笔记·算法·并查集
码流子20 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven20 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark20 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186120 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法