- 题目:m*n的矩阵,每个元素为一个非负数,寻求从top left到bottom right的一条路径,使得路径经过的所有元素相加之和最少。
- 难度:Medium
- 思路:按照从左上到右下的顺序,动态更新矩阵。
动态方程一:grid[i][j] = min(grid[i][j-1], grid[i-1][j]) + grid[i][j]
动态方程二:使用一个大小为n的一位数组,存储上一行的每一列元素,grid[j] = min(grid[j-1],grid[j]) + grid[i][j] grid[j-1]实际存储的是当前元素的左边元素值。 - 代码:
方法一:
public int minPathSum(int[][] grid) {
int m = grid.length;// row
int n = grid[0].length; // column
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j != 0) {
grid[i][j] = grid[i][j] + grid[i][j - 1];
} else if (i != 0 && j == 0) {
grid[i][j] = grid[i][j] + grid[i - 1][j];
} else if (i == 0 && j == 0) {
grid[i][j] = grid[i][j];
} else {
grid[i][j] = Math.min(grid[i][j - 1], grid[i - 1][j])
+ grid[i][j];
}
}
}
return grid[m - 1][n - 1];
}
方法二:
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[] result = new int[n];
result[0] = grid[0][0];
for(int i = 1; i < n; i++){
result[i] = result[i-1] + grid[0][i];
}
for(int i = 1; i < m; i++){
result[0] += grid[i][0];
for(int j = 1; j < n; j++){
result[j] = Math.min(result[j-1],result[j]) + grid[i][j];
}
}
return result[n-1];
}