最小路径和
题目描述
给定一个包含非负整数的 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
题目分析
显然,这道题可以使用动态规划来解决,我们把dp[i][j]
表示走到(i, j)
的最短路径和,则得到状态转移方程:
[!note]
题目提示“每次只能向下或者向右移动一步”,也就是说不会走回头路。所以,不用额外定义
dp
二维数组来存储(i, j)
的最短路径和,可以直接使用grid
来存储已计算的dp(i, j)
。
题解代码
/**
* @param {number[][]} grid
* @return {number}
*/
var minPathSum = function (grid) {
let i,
j,
m = grid.length, // 行长度
n = grid[0].length; // 列长度
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
// 初识位置
if (i == 0 && j == 0) continue;
// 只能从右边过来的
if (i == 0) grid[i][j] += grid[i][j - 1];
// 只能从上面过来的
else if (j == 0) grid[i][j] += grid[i - 1][j];
// 找两边来的最短路径
else grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
}
}
return grid[m - 1][n - 1];
};