Java版LeetCode热题100之跳跃游戏:贪心算法的完美应用
本文将全面深入剖析 LeetCode 热题第55题《跳跃游戏》,从题目理解、暴力解法、贪心优化、动态规划思路、代码实现、复杂度分析、面试技巧到实际应用场景,层层递进,帮助你彻底掌握这一经典算法问题。
一、原题回顾
题目描述:
给你一个非负整数数组 nums ,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
示例:
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
- $1 \leq \text{nums.length} \leq 10^4$
- $0 \leq \text{nums[i]} \leq 10^5$
二、原题分析
2.1 问题本质
这是一个典型的可达性问题,核心要求是:
- 从位置0开始,目标是到达位置
n-1(最后一个下标) - 在位置i时,可以跳跃到位置
[i+1, i+nums[i]]中的任意位置 - 判断是否存在一条路径从起点到终点
形式化表达:给定数组nums,是否存在一系列位置p_0=0, p_1, p_2, ..., p_k=n-1,使得对于每个j,都有p_{j+1} ≤ p_j + nums[p_j]。
2.2 关键约束分析
- 非负整数:
nums[i] ≥ 0,意味着不会出现"负向跳跃" - 最大跳跃长度:在位置i可以选择跳跃1步、2步、…、
nums[i]步中的任意步数 - 目标明确:只需要判断是否可达,不需要找出具体路径
- 边界情况:
- 数组只有一个元素 → 已经在终点,返回
true - 存在0值 → 可能形成"陷阱",无法继续前进
- 数组只有一个元素 → 已经在终点,返回

