您的位置:首页 > 其它

【DP】Minimum Path Sum

2014-03-31 16:55 246 查看
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.
解法:D[i][j]保存(0,0)到(i,j)的最小和,对边缘元素要判断

public class Solution {
public int minPathSum(int[][] grid) {
int len1 = grid.length;
if(len1 == 0) return 0;
int len2 = grid[0].length;
if(len2 == 0) return 0;

int d[][] = new int[len1][len2];

for(int i=0; i<len1; i++){
for(int j=0; j<len2; j++){
d[i][j] = grid[i][j];
if(i==0 && j==0) continue;
if(i==0) d[i][j] += d[i][j-1];
else if(j==0) d[i][j] += d[i-1][j];
else{
if(d[i][j-1] < d[i-1][j]) d[i][j] += d[i][j-1];
else d[i][j] += d[i-1][j];
}
}
}
return d[len1-1][len2-1];
}
}

改进:使用滚动数组,减少空间复杂度

public class Solution {
public int minPathSum(int[][] grid) {
int len1 = grid.length;
if(len1 == 0) return 0;
int len2 = grid[0].length;
if(len2 == 0) return 0;

int d[] = new int[len2];

for(int i=0; i<len1; i++){
for(int j=0; j<len2; j++){

if(i==0 && j==0) d[j] = grid[i][j];
else if(i==0) d[j] = d[j-1] + grid[i][j];
else if(j==0) d[j] = d[j] + grid[i][j];
else{
if(d[j-1] < d[j]) d[j] = d[j-1] + grid[i][j];
else d[j] = d[j] + grid[i][j];
}
}
}
return d[len2-1];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: