leetcode55 跳跃游戏

79 阅读1分钟

55. 跳跃游戏 - 力扣(LeetCode)

思路: 头开始往后处理,根据当前元素的步长,可以跳跃不同步长得到可达的元素位置。如第一个元素当前值为2,它可以跳一步或者两步两种选择处理,跳完之后得到新的步长继续上面的跳跃处理。

这种找路径,找方法一般采用递归回溯的方法来解决。 采用递归回溯的方式,相当于转换成树的层次遍历处理。

image.png 回溯和动态规划之间的关系:

一、以上这种可以通过回溯也就是树形解决,使用自顶向下的方法

二、在回溯的过程中,会有很多重复的计算,可以采用数组来保存其值,在重复计算时,可以直接调用数组减少递归

三、使用数组进行记忆后,还可以进行优化,变成自底向上的动态规划处理。

dp实现: 判断当前元素是否可达,依赖于前面的元素加上步长是否能达到。所以可以找到对应的状态关系

/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function (nums) {
    let len = nums.length
    //dp[i]:跳到i这个位置是否可达
    let dp = new Array(len).fill(false)
    dp[0] = true
    for (let i = 1; i < len; i++) {
        for (let j = i - 1; j >= 0; j--) {
            //j位置可达;同时j位置加上步长可以到达i位置,则i位置可达
            if (dp[j] && nums[j] >= i - j) {
                dp[i] = true
                break
            }
        }
    }
    return dp[len - 1]
};
let nums = [2, 3, 1, 1, 4]
console.log(jump(nums))