zoukankan      html  css  js  c++  java
  • 64.最小路径和

    2020-04-09
    最小路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

    题解:
    思路1: 动态规划

    我们新建一个额外的 dpdp 数组,与原矩阵大小相同。在这个矩阵中,dp(i, j)dp(i,j) 表示从坐标 (i, j)(i,j)

    到右下角的最小路径权值。我们初始化右下角的 dpdp 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,

    因此获得最小路径和我们有如下递推公式:

    dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))

    /**
     * @param {number[][]} grid
     * @return {number}
     */
    var minPathSum = function (grid) {
      let m = grid.length; // 行数
      let n = grid[0].length; // 列数
      let dp = Array(m).fill(0).map(x => Array(n).fill(0)); // 新建一个m行n列 全部为0 的空数组
      let r = 0; // grid[i][j]右边一个的值
      let b = 0; // grid[i][j]下面一个的值
      for (let i = m - 1; i >= 0; i--) {
        for (let j = n - 1; j >= 0; j--) {
          if (i === m - 1 && j === n - 1) {
            dp[i][j] = grid[i][j]; // 如果是最右下角的 那么直接赋值grid右下角的值
            continue;
          };
          
          b = i === m - 1 ? Number.MAX_SAFE_INTEGER : dp[i + 1][j]; // 如果是最后一行 最后一行没有下一行的元素所以是无限大
          r = j === n - 1 ? Number.MAX_SAFE_INTEGER : dp[i][j + 1]; // 如果是最后一列 最后一列没有右边的元素 所以是无限大
          dp[i][j] = grid[i][j] + Math.min(r, b); // dp[i][j]的值是他和右边和下面中较小的那个的和
        }
      }
      return dp[0][0];
    };
  • 相关阅读:
    生成组合算法
    今天复习C++的const,又学到了很多内容,总结一下[原创]
    文字和图片在一行,文字靠左,图片靠右(div)[转]
    联合查询
    排序查询
    分页查询 ★
    分组查询
    基础查询
    条件查询
    连接查询 (二)sql99语法
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12667154.html
Copyright © 2011-2022 走看看