题目
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
核心思路
1.预备二维DP表; 2.确认DP的是什么?求最小路径和,那就设为从[0,0]到每个节点的最小路径和 3.设置初始状态,左上角[0,0]步长 4.设置限制条件,只能向右向下走,因此存在i = 0或者j = 0 的两条边 5.DP: dp[i,j] = min{dp[i-1, j], dp[i, j-1]} + grid[i,j]
代码实例
var minPathSum = function (grid) {
if (!grid) return -1;
let row = grid.length;
let col = grid[0].length;
let dpArr = new Array(row).fill(0).map(item => {
return new Array(col).fill(0)
})
//初始值
dpArr[0][0] = grid[0][0]
// dp[i,j] = min{dp[i-1, j], dp[i, j-1]} + grid[i,j]
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (i === 0 && j === 0) {
dpArr[0][0] = grid[0][0];
} else if (i === 0 && j !== 0) {
dpArr[i][j] = dpArr[i][j - 1] + grid[i][j];
} else if (i !== 0 && j === 0) {
dpArr[i][j] = dpArr[i - 1][j] + grid[i][j];
} else {
dpArr[i][j] = Math.min(dpArr[i][j - 1], dpArr[i - 1][j]) + grid[i][j];
}
//都不等于0
}
}
return dpArr[row - 1][col - 1]
};