最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • LeetCode题解:63. 不同路径 II,动态规划,JavaScript,详细注释

    正文概述 掘金(LeeChen)   2021-02-18   456

    原题链接:leetcode-cn.com/problems/un…

    解题思路:

    1. 在网格中的任意一点,都有向右和向下两种走法。同时它也是从上方和左方两个位置走过来的。
    2. 那么,任意一点的走法数量,等于从起点走到上方和左方点的数量之和。
    3. 第一行和第一列都只有一种走法,就是从起点一直走到底。
    4. 我们可以用一个二维数组,画出网格中每个点的走法数量,一直递推到终点,终点存储的就是所有的走法数量。
    5. 因此动态规划的递推公式就是dp[i][j]=dp[i-1][j]+dp[i][j-1]
    6. 如果遇到障碍物,则该位置的走法数量为0。
    /**
     * @param {number[][]} obstacleGrid
     * @return {number}
     */
    var uniquePathsWithObstacles = function (obstacleGrid) {
      // 缓存网格行列的最后一位索引
      const m = obstacleGrid.length - 1;
      const n = obstacleGrid[0].length - 1;
    
      // 如果起点或终点是1,必然无法走到终点,路径数量为0
      if (obstacleGrid[0][0] === 1 || obstacleGrid[m][n] === 1) {
        return 0;
      }
    
      // 初始化第一行的dp数组,起点的值为1
      let dp = [new Array(n + 1).fill(0)];
      dp[0][0] = 1;
    
      // 创建第一列的初始路径数量
      for (let i = 1; i <= m; i++) {
        // 初始化当前行的初始路径数量,默认为0
        dp.push(new Array(n + 1).fill(0));
    
        if (obstacleGrid[i][0] === 0) {
          // 如果当前位置可以行走,数量等于上一行
          dp[i][0] = dp[i - 1][0];
        } else {
          // 如果当前位置不可行走,数量为0
          dp[i][0] = 0;
        }
      }
    
      // 初始化第一行的路径数量
      for (let i = 0; i <= n; i++) {
        if (obstacleGrid[0][i] === 0) {
          // 如果当前位置可以行走,数量为1
          dp[0][i] = 1;
        } else {
          // 如果当前位置不可行走,从这以后的数量都为0
          // 第一行初始化的值都为0,直接退出即可
          break;
        }
      }
    
      // 从第二行、第二列开始遍历整个网格,计算路径数量
      for (let i = 1; i <= m; i++) {
        for (let j = 1; j <= n; j++) {
          if (obstacleGrid[i][j] === 0) {
            // 如果当前位置可以行走,路径数量为从上、左两个方向走过来的数量之和
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
          } else {
            // 如果当前位置不可行走,路径数量为0
            dp[i][j] = 0;
          }
        }
      }
    
      // 终点存储的是所有路径数量
      return dp[m][n];
    };
    
    1. 实际上我们计算某个点的步数时,只需要左边和上边的值即可。
    2. 我们可以只用一个数组,而且我们每次都是从左向右生成步数,因此就有以下特点:
      • 因此对于第m行来说,它存储的就是m-1行的步数。
      • 对于第n列来说,它的n-1位置存储了n-1位置的步数。

    代码优化如下:

    /**
     * @param {number[][]} obstacleGrid
     * @return {number}
     */
    var uniquePathsWithObstacles = function (obstacleGrid) {
      // 缓存网格行列的最后一位索引
      const m = obstacleGrid.length - 1;
      const n = obstacleGrid[0].length - 1;
    
      // 如果起点或终点是1,必然无法走到终点,路径数量为0
      if (obstacleGrid[0][0] === 1 || obstacleGrid[m][n] === 1) {
        return 0;
      }
    
      // 初始化第一行的dp数组,起点的值为1
      let dp = new Array(n + 1).fill(0);
      dp[0] = 1;
    
      // 从第二行、第二列开始遍历整个网格,计算路径数量
      for (let i = 0; i <= m; i++) {
        for (let j = 0; j <= n; j++) {
          // 如果当前位置是障碍物,路径数量为0
          if (obstacleGrid[i][j] === 1) {
            dp[j] = 0;
            continue;
          }
    
          // j为0无需更新,会一直保持上一行的值
          if (j > 0) {
            // 如果当前位置可以行走,路径数量为从上、左两个方向走过来的数量之和
            dp[j] = dp[j - 1] + dp[j];
          }
        }
      }
    
      // 终点存储的是所有路径数量
      return dp[n];
    };
    

    起源地下载网 » LeetCode题解:63. 不同路径 II,动态规划,JavaScript,详细注释

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元