首页 > 其他 > 详细

64.最小路径和

时间:2020-04-09 15:47:05      阅读:92      评论:0      收藏:0      [点我收藏+]
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];
};

 

64.最小路径和

原文:https://www.cnblogs.com/lanpang9661/p/12667154.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!