原题链接在这里:https://leetcode.com/problems/minimum-path-sum/
是DP题,与Unique Paths 和 Unique Paths II相似。存储历史信息是走到走到历史点的最小权重路径,更新当前点用上面点和左面点中的小值加上grid中当前点的值。
跟Unique Paths 和 Unique Paths II 都有相同的第二种降维方法。
AC Java:
public class Solution {
public int minPathSum(int[][] grid) {
/*
//Method 1
if(grid == null || grid.length == 0 || grid[0].length == 0){
return Integer.MAX_VALUE;
}
int row = grid.length;
int column = grid[0].length;
int [][] res = new int[row][column];
res[0][0] = grid[0][0];
for(int i = 1; i < row; i++){
res[i][0] = res[i-1][0] + grid[i][0];
}
for(int j = 1; j < column; j++){
res[0][j] = res[0][j-1] + grid[0][j];
}
for(int i = 1; i<row; i++){
for(int j = 1; j< column; j++){
res[i][j] = Math.min(res[i-1][j], res[i][j-1])+grid[i][j];
}
}
return res[row-1][column-1];
*/
//Method 2
if(grid == null || grid.length == 0 || grid[0].length == 0){
return Integer.MAX_VALUE;
}
int row = grid.length;
int column = grid[0].length;
int [] res = new int[column];
res[0] = grid[0][0];
for(int j = 1; j< column; j++){
res[j] = res[j-1] + grid[0][j];
}
for(int i = 1; i < row; i++){
for(int j = 0; j< column; j++){
if(j == 0){
res[j] += grid[i][j];
}else{
res[j] = Math.min(res[j-1], res[j]) + grid[i][j];
}
}
}
return res[column-1];
}
}