力扣hot100:跳跃游戏

题目描述:

贪心算法思想:

贪心算法的核心是每一步都做出当前状态下的局部最优选择,最终期望得到全局最优解。对于本题,局部最优策略是:在遍历过程中,持续维护 "当前能到达的最大索引",每到一个位置,就更新这个最大索引(取当前最大索引与 "当前位置 + 当前位置能跳的最大长度" 的较大值)。通过这种局部最优的更新,最终判断是否能覆盖到数组的最后一个索引。

思路解析:

要判断能否到达数组最后一个下标,关键在于跟踪 "能到达的最远位置",具体思路如下:

  1. 初始化最大可达索引:从数组第一个元素开始,初始最大可达索引为0(起始位置)。
  2. 遍历数组的每个位置:
    • 若当前遍历的索引i超过了 "当前能到达的最大索引",说明该位置无法到达,直接返回false
    • 否则,更新 "能到达的最大索引"(取当前最大索引与i + nums[i]的较大值,i + nums[i]是从当前位置i能跳到的最远位置)。
    • 若更新后的最大索引已经覆盖了数组的最后一个下标(即maxLength >= n-1),直接返回true(提前终止,提升效率)。
  3. 遍历结束:若顺利遍历完所有位置,说明最后一个下标可到达,返回true

代码:

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length; // 获取数组长度
        if (n == 0) { // 处理空数组的边界情况
            return false;
        }
        int maxLength = 0; // 记录当前能到达的最大索引
        for (int i = 0; i < n; i++) { // 遍历数组的每个位置
            // 若当前索引超过了能到达的最大范围,说明无法到达后续位置,返回false
            if (i > maxLength) {
                return false;
            }
            // 更新能到达的最大索引:取当前最大索引 与 "当前位置+当前位置能跳的最大长度"的较大值
            maxLength = Math.max(maxLength, i + nums[i]);
            // 若最大索引已覆盖最后一个下标,直接返回true(提前终止)
            if (maxLength >= n - 1) {
                return true;
            }
        }
        return true; // 遍历完成后,说明最后一个下标可到达
    }
}

代码解析:

  • 边界处理:if (n == 0) 处理空数组场景,避免后续逻辑出错。
  • 遍历与合法性判断:if (i > maxLength) 是核心判断 ------ 若当前位置i不在 "能到达的范围" 内,说明无法继续前进,直接返回false
  • 贪心更新最大可达索引:maxLength = Math.max(maxLength, i + nums[i]) 是贪心策略的体现 ------ 每一步都尽可能扩大 "能到达的范围",保证局部最优。
  • 提前终止:if (maxLength >= n - 1) 一旦最大范围覆盖了最后一个下标,立即返回true,无需遍历剩余元素,提升算法效率。
相关推荐
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
金銀銅鐵2 天前
[Python] 模 n 乘法的逆元计算器
python·数学·游戏
_清歌3 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局3 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象3 天前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法