这是我参与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
};