返回

LeetCode题解:55. 跳跃游戏,贪心算法,JavaScript,详细注释

前端

题目

给你一个非负整数数组nums,其中nums[i]表示从索引i跳跃到索引i+nums[i]的最大距离。请你判断是否能够从数组的第一个元素出发,通过多次跳跃到达数组的最后一个元素。

例如:

输入:nums = [2,3,1,1,4]
输出:true
解释:从索引0出发,可以跳到索引123。
从索引1出发,可以跳到索引234。
从索引2出发,可以跳到索引34。
从索引3出发,可以跳到索引4。
因此,可以从索引0出发,通过多次跳跃到达数组的最后一个元素。

解题思路

这道题可以用贪心算法来解决。

  1. 首先,我们从数组的第一个元素出发,并计算从这个元素最多可以跳到哪个索引。
  2. 然后,我们将这个索引标记为当前可到达的边界。
  3. 接着,我们继续从当前可到达的边界开始,重复步骤1和步骤2,直到我们到达数组的最后一个元素。
  4. 如果在任何时候,我们发现当前可到达的边界小于数组的长度,这意味着我们无法从第一个元素到达最后一个元素,因此返回false。

代码实现

/**
 * 判断是否能够从数组的第一个元素出发,通过多次跳跃到达数组的最后一个元素。
 *
 * @param {number[]} nums 非负整数数组
 * @return {boolean} true if it is possible to reach the last element, false otherwise
 */
const canJump = (nums) => {
  // 当前可到达的边界
  let boundary = 0;

  // 从第一个元素开始
  for (let i = 0; i < nums.length; i++) {
    // 计算从当前元素最多可以跳到哪个索引
    const nextBoundary = i + nums[i];

    // 更新当前可到达的边界
    boundary = Math.max(boundary, nextBoundary);

    // 如果当前可到达的边界小于数组的长度,意味着无法从第一个元素到达最后一个元素
    if (boundary < nums.length - 1) {
      return false;
    }
  }

  // 如果当前可到达的边界大于等于数组的长度,意味着可以从第一个元素到达最后一个元素
  return true;
};

复杂度分析

  • 时间复杂度:O(n),其中n是数组的长度。
  • 空间复杂度:O(1),因为我们只使用了常数空间来存储变量。

总结

这道题是一道经典的贪心算法题。通过使用贪心算法,我们可以快速地判断是否能够从数组的第一个元素到达最后一个元素。希望这篇题解对您有所帮助!