描述
给定一个只含非负整数的m*nm∗n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
你在同一时间只能向下或者向右移动一步
样例
样例 1:
输入:
grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:
7
解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1
样例 2:
输入:
grid = [[1,3,2]]
输出:
6
解释:
路线是: 1 -> 3 -> 2
思路:重点在于边界条件
可以使用滚动数组进行优化
public class Solution {
/**
* @param grid: a list of lists of integers
* @return: An integer, minimizes the sum of all numbers along its path
*/
public int minPathSum(int[][] grid) {
if(grid.length==0) return 0;
int m = grid.length;
int n =grid[0].length;
int[][] dp = new int[2][n];
int now =0,old =1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i>0&&j>0) dp[now][j] = grid[i][j]+Math.min(dp[old][j],dp[now][j-1]);
else if(j==0&&i==0) dp[now][j]= grid[0][0];
else if(i>0) dp[now][j] = grid[i][j]+dp[old][j];
else if(j>0) dp[now][j] = grid[i][j]+dp[now][j-1];
}
now = old;
old = 1-now;
}
return dp[old][n-1];
}
}