LeetCode 55 Jump Game (Tag:Array Difficulty:Medium)

193 阅读2分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

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

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

链接:leetcode-cn.com/problems/ju…

题解

在题目leetcode 45 Jump Game II 中, 我们利用贪心法找出了最小能到达结尾的步数, 而这道题目相对来说更简单, 只需要确定能不能达到最后一个元素即可. 我们可以回顾一下之前的贪心算法. 找出当前能达到的最远的位置, 并且在前进的过程中记录最远可以达到的位置, 在当前能到达的最远的位置之后, 把当前最远的位置换成记录好的最远可以达到的位置, 步数加一. 具体细节可以再看看那篇文章.

而这道题目, 其实就更简单了, 我们只需要记录最远可以达到的位置, 并且在前进过程中更新最远可以达到的位置, 如果在前进过程中最远可以达到的位置已经达到了, 说明不能抵达最终的元素, 返回false, 否则返回true.

提醒一下, 在位置 i 上可以到达的位置为 i + nums[i], 我们可以根据这个特点来更新最远位置.

具体实现见如下代码.

时间复杂度为 O(n), 空间复杂度为 O(1).

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
    let maxPosition = nums[0]
    for (let i = 1; i < nums.length; ++i) {
      if (maxPosition < i) {
        return false
      } 
      maxPosition = Math.max(maxPosition, i + nums[i])
    }
    return true
};