题目:
给定一个包含非负整数的 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]
};