/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
// 先用动态规划做一遍
// 用一个数组meno[]代表nums每一个位置 从那个位置到nums结尾的话能不能通过 0代表未知,1代表能通过,-1代表不能通过
// 首先都是0填充 最后一个位置一定是通过的 因为每个位置数字都是>=0的 到最后一个位置一定是可以通过
let meno = Array(nums.length).fill(0);
meno[nums.length-1] = 1;
// 重后往前遍历 用max代表在当前遍历元素(nums[i])的这个数组的位置可以跨越到数组的最远位置的index
// 如果这个范围内 有可以通过的 就说明遍历的当前位置也可以通过
// 最后判断meno[0]可不可以通过 如果可以的话 返回true 不可以返回false
for(let i = nums.length -2; i>=0; i--) {
let max = Math.min(nums[i]+i, nums.length -1); // 能跨的最大位置
for(let j = i+1; j<=max; j++) {
if (meno[j] === 1) {
meno[i] = 1
break
}
}
}
if(meno[0] === 1) {
return true
} else{
return false
}
};
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
// 利用贪心算法 用jumpmax代表 数组index的位置可以到达最后
let jumpmax = nums.length -1 // jumpmax位置能到最后
for(let i = nums.length -2;i>=0 ;i--) {
if(nums[i]+i >= jumpmax ) { // 当前位置能达到的最大位置能走到最后 更新能走到最后的位置
jumpmax = i;
}
}
// 如果 jumpmax能达到0 就说明可以从头走到最后
return jumpmax === 0;
};