您的位置:首页 > 其它

leetcode--minimum_path_sum

2016-11-19 23:12 302 查看
题意: 给定一个由非负整数填满的m×n的网格,查找一条从左上方到右下方的路径,使得这条路径中所有数之和最小,只能向有或者向下走。

分析: 本题有点类似于这道题,只是需要修改下递推公式。设i, j为二维数组的坐标。

minPathSum(i,j)=⎧⎩⎨⎪⎪min(minPathSum(i+1,j)minPathSum(i,j+1))+grid(i,j)minPathSum(i+1,j)+grid(i,j)x(i,j+1)if i≤m−2 and j≤n−2if i≤m−2 and j=n−1if i=m−1 and j≤n−2

代码(递归,会超时,放在这儿便于理解)

public int minPathSum(int[][] grid) {
return minPartitionSum(grid, 0, 0);
}

public int minPartitionSum(int[][] grid, int i, int j){
if(i == grid.length - 1 && j == grid[0].length - 1){
return grid[i][j];
}else if(i == grid.length - 1){
return grid[i][j] + minPartitionSum(grid, i, j + 1);
}else if(j == grid[0].length - 1){
return grid[i][j] + minPartitionSum(grid, i + 1, j);
}else{
return Math.min(minPartitionSum(grid, i + 1, j), minPartitionSum(grid, i, j + 1)) + grid[i][j];
}
}


代码 (迭代)

public int minPathSum(int[][] grid){
int m = grid.length;
int n = grid[0].length;
int[][] pathSum = new int[m]
;
pathSum[m - 1][n - 1] = grid[m - 1][n - 1];
for(int i = m - 2; i >= 0; i--){    //将最后一列先赋值
pathSum[i][n - 1] = grid[i][n - 1] + pathSum[i + 1][n - 1];
}
for(int j = n - 2; j >= 0; j--){    //将最后一行先赋值
pathSum[m - 1][j] += grid[m - 1][j] + pathSum[m - 1][j + 1];
}
for(int i = m - 2; i >= 0; i--){
for(int j = n - 2; j >= 0; j--){
pathSum[i][j] = grid[i][j] + Math.min(pathSum[i + 1][j], pathSum[i][j + 1]);
}
}
return pathSum[0][0];
}


源程序下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: