力扣题库JS版:最小路径和

题目:

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

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

示例 1:

在这里插入图片描述

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

解题思想:

在这里插入图片描述
辅组数组dpt需从下往上初始化,下面的代码实现就是从上面方程式转化而来,但需要加入一些特殊判断,因为不是所有的点都可以向下或向右走,比如最后一行只可以向右走,最后一列只可以向下走。

代码实现:

/**
 * @param {number[][]} grid
 * @return {number}
 */
var minPathSum = function(grid) {
    
    
        let row = grid.length
        let column = grid[0].length
        let dpt = []
        for (let i = 0; i < row; i++) {
    
    
          //初始化为二维数组
          dpt[i] = new Array(column)
        }
        for (let i = row - 1; i >= 0; i--) {
    
    
          for (let j = column - 1; j >= 0; j--) {
    
    
            if (i === row - 1) {
    
    
              //特殊行初始化,最后一行只能向右走,则dpt[i][j]只取决于grid[i][j]+dpt[i][j+1]
              if (j === column - 1) {
    
    
                  //这是右下角的点,dpt[i][j]只取决grid[i][j]
                dpt[i][j] = grid[i][j]
              } else {
    
    
                dpt[i][j] = grid[i][j] + dpt[i][j + 1]
              }
            } else if (j === column - 1) {
    
    
              //特殊列初始化,最后一列只能向下走,则dpt[i][j]只取决于grid[i][j]+dpt[i+1][j]
              dpt[i][j] = dpt[i + 1][j] + grid[i][j]
            } else {
    
    
              //进入这里的都不用考虑边界问题
              dpt[i][j] = grid[i][j] + Math.min(dpt[i][j + 1], dpt[i + 1][j])
            }
          }
        }
        return dpt[0][0]
};

猜你喜欢

转载自blog.csdn.net/weixin_43334673/article/details/111712620