给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
解题思路: 采用动态规划,从矩阵的右下角开始,依次更新矩阵中的值,当前矩阵的值grid[i][j]代表从当前点到达右下角路径最小值,每次可以选择向下或者向右走,因此更新路径值时,选择两个方向上的最小值来更新。
class Solution {
public int minPathSum(int[][] grid) {
if(grid==null || grid.length==0){
return 0;
}
int m = grid.length-1;
int n = grid[0].length-1;
for(int i = m;i >= 0;i--){
for(int j = n;j >= 0;j--){
if(i==m && j != n){
grid[i][j] = grid[i][j] + grid[i][j+1];
}else if(i != m && j==n){
grid[i][j] = grid[i][j] + grid[i+1][j];
}else if(i != m && j != n){
grid[i][j] = grid[i][j] + Math.min(grid[i][j+1],grid[i+1][j]);
}
}
}
return grid[0][0];
}
}