leetcode - 45. 跳跃游戏 II

45 阅读1分钟

45. 跳跃游戏 II

leetcode.cn/problems/ju…

暴力超时

/**
 * 暴力超时
 * @param {number[]} nums
 * @return {number}
 */
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

/**
 * 存在重复子问题
 * 记忆化搜索
 * @param {number[]} nums
 * @return {number}
 */
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] 
};

递推动态规划

/**
 * 记忆化搜索改成动态规划
 * 发现正着推不行,得倒着推
 * @param {number[]} nums
 * @return {number}
 */
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]
};