leetcode45 跳跃游戏 II

106 阅读1分钟

45. 跳跃游戏 II - 力扣(LeetCode)

思路: 计算跳跃到当前元素的最少步长,需要计算当前元素前面的所有元素,是否能到达同时步长是多少,取最小的步长。

相比于55跳跃游戏只需要判断是否可达即可。本题需要在55基础上再比较一下哪些可达的步数最少。同时dp[i] 代表的含义不同。本题的dp[i] 表示到达当前元素最少的步长。leetcode55 跳跃游戏 - 掘金 (juejin.cn)

/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function (nums) {
    let len = nums.length
    let dp = new Array(len).fill(Infinity)
    dp[0] = 0
    for (let i = 1; i < len; i++) {
        //遍历当前元素前面的所有元素
        for (let j = i - 1; j >= 0; j--) {
            //如果可以达到 并计算步长
            if (j + nums[j] >= i) {
                dp[i] = Math.min(dp[i], dp[j] + 1)
            }
        }
    }
    // console.log(dp)
    return dp[len - 1]
};
let nums = [2, 3, 1, 1, 4]
nums = [2, 1]
nums = [1]
console.log(jump(nums))

通过获取边界值来处理跳跃

/**
 * 思路:有一个边界,当位置i达到边界的时候,就得跳了
 * end是边界;max是当前能跳的最大距离 
 * 默认第一步就跳了一次,所以最后一个位置的时候不用参与跳
 */
var jump = function (nums) {
    let step = 0, max = 0, end = 0
    for (let i = 0; i < nums.length - 1; i++) {
        //每次都要计算一下能跳的最大距离
        max = Math.max(max, i + nums[i])
        if (i == end) {
            //达到边界之后,边界重新赋值
            end = max
            step++
        }
    }
    return step
};
let nums = [2, 3]
nums = [2, 3, 0, 1, 4]
console.log(jump(nums))