题目:
给定一个只含非负整数的 m x n 网格,找到一条从左上角到右下角的可以使数字之和最小的路径。
注意: 每次只能向下或者向右移动一步。
示例 1:
[[1,3,1], [1,5,1], [4,2,1]]
根据上面的数组,返回 7
. 因为路径 1→3→1→1→1 总和最小。
思路:
参考上一篇的62题,其实思路完全一样,不考虑使用迭代的形式,而是考虑从最右下角开始往上追溯。
路径总长为0时,直接返回0。
其余情况下,如果起点格在最底或者最右,那么其到终点的路径长度等于自身的数值加上其右边或者下边格子到终点的路径数;如果起点不在最底或者最右,那么其到终点的路径长度等于自身的数值加上以其右边和下边格子为起点的路径数的最小值,这一段可能比较拗口,以理解为主。
总的来说还是一个迭代的计算方式。
代码:
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = 0;
if(m > 0)
n = grid[m-1].length;
else
return 0;
int[][] num = new int[m][n];
for (int i = m-1;i >= 0;i--){
for (int j = n-1;j >= 0;j--){
if(i == m-1 && j == n-1)
num[i][j] = grid[i][j];
else if (i == m-1)
num[i][j] = grid[i][j] + num[i][j+1];
else if (j == n-1)
num[i][j] = grid[i][j] + num[i+1][j];
else
num[i][j] = grid[i][j] + Math.min(num[i+1][j],num[i][j+1]);
}
}
return num[0][0];
}
}