leetcode 55跳跃游戏

106 阅读1分钟
/**
 * @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;
};