• 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];
    };
  • 相关阅读:
    linux编程之main()函数启动过程【转】
    dlmalloc(一)【转】
    Linux进程调度原理【转】
    Linux内存管理原理【转】
    malloc原理和内存碎片【转】
    Linux MTD系统剖析【转】
    linux驱动开发:用户空间操作LCD显示简单的图片【转】
    LCD驱动分析【转】
    LCD常用接口原理【转】
    LCD之mipi DSI接口驱动调试流程【转】
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12667154.html
Copyright © 2020-2023  润新知