45. 跳跃游戏 II
leetcode.cn/problems/ju…
暴力超时
var jump = function(nums) {
const n = nums.length
let minCount = n
function dfs(i,count){
if(i >= n - 1){
minCount = Math.min(count,minCount)
return
}
if(nums[i] === 0) return
for(let k = i + 1; k <= i + nums[i]; k ++){
dfs(k,count + 1)
}
}
dfs(0,0)
return minCount
};
记忆化搜索dfs
var jump1 = function(nums) {
const n = nums.length
const cache = []
function dfs(i){
if(i >= n - 1){
cache[n - 1 ] = 0
return 0
}
if(nums[i] === 0) {
cache[i] = Infinity
return Infinity
}
if(cache[i] !== undefined){
return cache[i]
}
let min = Infinity
for(let k = i + 1; k <= Math.min(i + nums[i], n - 1); k ++){
min = Math.min(dfs(k) + 1,min)
}
cache[i] = min
return min
}
dfs(0)
return cache[0]
};
递推动态规划
var jump2 = function(nums) {
const n = nums.length
const dp = []
dp[n-1] = 0
for(let i = n - 2; i >= 0; i -- ){
if(nums[i] === 0) {
dp[i] = Infinity
continue
}
let min = Infinity
for(let k = i + 1; k <= Math.min(i + nums[i], n - 1); k ++){
min = Math.min(dp[k] + 1,min)
}
dp[i] = min
}
console.log(dp);
return dp[0]
};