55. 跳跃游戏

贪心

解题思路

  1. 局部最优:每次取最大跳跃步数(取最大覆盖范围);

  2. 整体最优:最后得到整体最大覆盖范围,看是否能到终点;

  3. 不用考虑每一步跳跃到哪个位置,而是尽可能的跳跃到最远的位置,看最多能覆盖的位置,不断更新能覆盖的距离;

  4. 那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点,每次移动只能在 cover 的范围内移动,每移动一个元素 cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去;

图解

复杂度

  1. 时间复杂度:O(n),其中 n 是数组的长度;

  2. 空间复杂度:O(1)

代码实现

var canJump = function (nums) {
    // 长度为 1 直接就是终点
    if (nums.length === 1) return true;

    // 能覆盖的最远距离
    let cover = 0; 
    for (let i = 0; i <= cover; i++) {
        // 当前覆盖距离 cover 和当前位置加能跳跃的距离中取一个较大者
        cover = Math.max(cover, i + nums[i]);

        // 覆盖距离超过或等于 nums.length - 1 说明能到达终点
        if (cover >= nums.length - 1) return true;
    }

    // 循环完成之后,还没返回 true 就是不能达到终点
    return false;
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 贪心
    1. 1.1. 解题思路
    2. 1.2. 图解
    3. 1.3. 复杂度
    4. 1.4. 代码实现