问题
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
例子
思路
-
方法1
dp,直接在数组修改
grid[i][j]=Math.max(grid[i][j-1], grid[i-1][j])+grid[i][j]; -
方法2
代码
//方法1 4ms
class Solution {
public int minPathSum(int[][] grid) {
for(int i=0; i<grid.length; i++) {
for(int j=0; j<grid[0].length; j++) {
if(i==0 && j==0) continue;
else{
//左边的
int a = j-1>=0?grid[i][j-1]:Integer.MAX_VALUE;
//上边的
int b = i-1>=0?grid[i-1][j]:Integer.MAX_VALUE;
grid[i][j]=Math.min(a,b)+grid[i][j];
}
}
}
return grid[grid.length-1][grid[0].length-1];
}
}
//方法2 3ms
for(int i=0; i<grid.length; i++) {
for(int j=0; j<grid[0].length; j++) {
if(i==0 && j==0) continue;
else if(i==0) grid[i][j]+=grid[i][j-1];
else if(j==0) grid[i][j]+=grid[i-1][j];
else grid[i][j]=Math.min(grid[i-1][j],grid[i][j-1])+grid[i][j];
}
}
return grid[grid.length-1][grid[0].length-1];