一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 15 天,点击查看活动详情。
跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
1 <= nums.length <= 3 *0 <= nums[i] <=
思路分析
- 分析题目可以得知,想要判断是否可以到达最后一个下标,那么往前递推,如果可以到达 第nums.length-2 个下标,并且nums[nums.length - 2] 不为0,那么就可以到达第 nums.length-1个下标;
- 因此我们使用一个数组 dp 来表示是否能到达下标 i,对于每个位置 i 来说,只需要判断是否能从前面的位置跳跃过来即可;对于当前位置 j 来说,能否跳到 i 的判断条件为:可以到达 j 位置,并且 j 位置的值加上 下标j 大于 下标i,若满足这个条件,就将 dp[i] 更新为 true;
- 遍历完成后,可以得到一个能否到达下标 i 的数组,返回 dp[num.length - 1] 即可。
AC 代码
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
const len = nums.length
let dp = new Array(len).fill(false) //初始化dp
dp[0] = true //第一项能到达
for (let i = 1; i < len; i++) {
for (let j = 0; j < i; j++) {
//当前位置j能达到,并且当前位置j加上能到达的位置如果超过了i,那dp[i]更新为ture,便是i位置也可以到达
if (dp[j] && nums[j] + j >= i) {
dp[i] = true
break
}
}
}
return dp[nums.length - 1]
};
结果:
- 执行结果: 通过
- 执行用时:1772 ms, 在所有 JavaScript 提交中击败了5.03%的用户
- 内存消耗:46.5 MB, 在所有 JavaScript 提交中击败了15.95%的用户
- 通过测试用例:170 / 170