思路: 计算跳跃到当前元素的最少步长,需要计算当前元素前面的所有元素,是否能到达同时步长是多少,取最小的步长。
相比于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))