思路: 头开始往后处理,根据当前元素的步长,可以跳跃不同步长得到可达的元素位置。如第一个元素当前值为2,它可以跳一步或者两步两种选择处理,跳完之后得到新的步长继续上面的跳跃处理。
这种找路径,找方法一般采用递归回溯的方法来解决。 采用递归回溯的方式,相当于转换成树的层次遍历处理。
回溯和动态规划之间的关系:
一、以上这种可以通过回溯也就是树形解决,使用自顶向下的方法
二、在回溯的过程中,会有很多重复的计算,可以采用数组来保存其值,在重复计算时,可以直接调用数组减少递归
三、使用数组进行记忆后,还可以进行优化,变成自底向上的动态规划处理。
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))