zoukankan      html  css  js  c++  java
  • leetcode[55]跳跃游戏

    题目就是这么个题目,难也不是一般的难,考察的是动态规划和贪心算法

    本文我将从三种方法来编码解决这道题(动态规划(topdown)、动态规划(downup)、贪心)

    一、动态规划(topdown从开始到结尾)

    递归的过程,把所有的可能展开;探索所有的路是否能走通,将结果往下压

    那么如何将动态规划加入递归里呢?

    假设:3不是开始位置,3前面还有以一些数据,但是,一旦我们认定了1是一条思路之后,我们可以认为:只要从前面的地方(不管是从哪个地方)只要到了1,那么就不用继续往下走了,这条路肯定是不同的,直接返回即可。

    首先,我们需要建立一个表格

     

    小二迫不及待地为大家上了代码

    var canJump = function (nums) {
      // 记录数组的总长度
      const totalLength = nums.length - 1
      // 初始化一个记忆数组,填充为0
      const memo = Array(totalLength).fill(0)
      // 最后一位为1
      memo[totalLength - 1] = 1
    
      // 递归函数,传递一个位置
      function jump(position){
        // 看当前的位置是否是通路(1通,-1不通,0未知)
        if(memo[position] === 1){
          return true
        }else if(memo[position] === -1){
          return false
        }
    
        // 定义一个变量maxJump用来存放跳跃步数(防止越界)
        const maxJump = Math.min(position + nums[position],totalLength -1)
        // 遍历所有的步数
        for(let i = position +1;i<=maxJump;i++){
          const jumpResult = jump(i)
          // 如果是true,证明:此位置是通的,将true往上传
          if(jumpResult === true){
            memo[position] =1
            return true
          }
        }
        // 如果所有的路都尝试了,仍没有返回true,就将此位置置为-1(不通),
        // 将false往上传
        memo[position] = -1
        return false
      }
    
      let result = jump(0)
      return result
    };

    二、动态规划(downup从结尾到开始)

    // 动态规划(downup)
    var canJump = function (nums) {
      // 记录数组的总长度
      const totalLength = nums.length 
      // 初始化一个记忆数组,填充为0
      const memo = Array(totalLength).fill(0)
      // 最后一位为1
      memo[totalLength - 1] = 1
    
      // 从倒数第二位开始向前遍历(倒数第一位已经是1)
      for(let i = totalLength - 2; i>=0; i--){
        const maxJump = Math.min(i+nums[i],totalLength -1)
        // 遍历可走的步数
        for(let j = i+1;j <= maxJump;j++){
          // 只要有某个步数可以到1,剩下的就不用看了直接break返回
          if(memo[j] === 1){
            memo[i] = 1
            break
          }
        }
      }
      // 如果顺利的遍历到了第一位,且为1,就代表成功了
      if(memo[0] === 1){
        return true
      }else{
        return false
      }
    };

    三、贪心算法

     * 1.定义一个变量maxJump,等于数组的长度-1
     * 2.从后往前遍历,判断前一位的值+索引的和是否大于等于maxJump
     * 如果大于等于的话说明前一位一定能走到后面一位
     * 3.大于等于情况下:maxjump变为前一位的索引
     * 4.如果小于的话,就放弃前一位,继续往前
     * 5.for循环遍历完成之后,判断maxjump是否等于0,
     * 等于的话返回true,否则返回false
     * [3,1,0,2,4]计算过程
     *  0,1,2,3,4
     * 第一步:maxjump = 4
     * 第二步:2+3=5 >= 4,maxjump = 3
     * 第三步:0+2=2 <3 ,继续往前
     * 第四步:1+1=2 <3,继续往前
     * 第五步: 3+0=3 >=3,maxjump =0,返回true
    var canJump = function(nums) {
      let maxJump = nums.length-1
      for(let i = nums.length-2;i>=0;i--){
        if(nums[i]+i >= maxJump){
          maxJump = i
        }
      }
      return maxJump === 0
    };
    

      

  • 相关阅读:
    HDU-ACM“菜鸟先飞”冬训系列赛——第9场
    HDU3092:Least common multiple(素数筛选+完全背包)
    HDU1452:Happy 2004(积性函数)(因子和)
    HDU-ACM“菜鸟先飞”冬训系列赛——第8场(1004)
    Codeforces Round #395 (Div. 2)
    一些算法技巧整理(添加中)
    poj 1852 Ants
    hdu 1587 Flowers
    hdu 1563 Find your present!
    hdu 1570 AC
  • 原文地址:https://www.cnblogs.com/yaya-003/p/12882382.html
Copyright © 2011-2022 走看看