给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。
思路:求从左上到右下的路径最小和
因为每次只能向下或向右一步,所以这里我们可以逐个计算到每个格的最小距离,直到右下为止。
现在原网格 grid 如下图,
1 | 3 | 1 |
1 | 5 | 1 |
4 | 2 | 4 |
我们需要计算从左上角到各个位置的最短路径,新网格为gridDb
比如到 grid[0][1] 的最小路径,是 1+3=4,则 gridDb[0][1] 为 4 ,
到 grid[0][2] 的最小路径,是 4+1=5,则 gridDb[0][2] 为 5 ,
到 grid[1][0] 的最小路径,是 1+1=2,则 gridDb[1][0] 为 2 ,
到 grid[2][0] 的最小路径,是 2+4=6,则 gridDb[2][0] 为 6 ,
然后,到 grid[1][1] 的最小路径呢?
因为每次只能向下或向右一步,所以到 grid[1][1] 的最小路径就是
grid[1][1] 上的值加上到 grid[1][0] 或者到 grid[0][1] 的最短路径,
那么到 grid[1][1] 的最小路径是 5+min(2,4)=7,
依次类推,可以得到所有的最短路径。
1 | 4 | 5 |
2 | 7 | 6 |
6 | 8 | 7 |
代码:
class Solution {
public int minPathSum(int[][] grid) {
int[][] db = new int[grid.length][grid[0].length];
db[0][0] = grid[0][0];
int i,j;
//计算第一列的最短路径
for(i = 1;i < grid.length;i ++){
db[i][0] = db[i - 1][0] + grid[i][0];
}
//计算第一行的最短路径
for(j = 1;j < grid[0].length;j ++){
db[0][j] = db[0][j - 1] + grid[0][j];
}
//计算剩余的最短路径
for(i = 1;i < grid.length;i ++){
for(j = 1;j < grid[0].length;j ++){
db[i][j] = grid[i][j] + Math.min(db[i - 1][j],db[i][j - 1]);
}
}
return db[i - 1][j - 1];
}
}