矩阵最小路径和(java实现)

来源:互联网 发布:实况足球2017球员数据 编辑:程序博客网 时间:2024/04/16 20:48
package minpathsum;
/**
 * 矩阵最小路径和
 *
 */
public class MinPathSum {
/**
 * 方法一:时间复杂度O(M*N),M为行数,N为列数,已知矩阵m
 * 求[i][j]位置上最短的路径,也即是求左边和上边到达[i][j]最小值
 * dp[i][j]=min{dp[i-1][j],dp[i][j-1]}+m[i][j];
 */
public int minPathSum1(int[][] m){
if(m==null||m.length==0||m[0]==null||m[0].length==0){
return 0;
}
int row=m.length;
int col=m[0].length;
int[][] dp=new int[row][col];
dp[0][0]=m[0][0];
for(int i=1;i<row;i++){
dp[i][0]=dp[i-1][0]+m[i][0];
}
for(int j=1;j<col;j++){
dp[0][j]=dp[0][j-1]+m[0][j];
}
for(int i=1;i<row;i++){
for(int j=1;j<col;j++){
dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+m[i][j];
}
}
return dp[row-1][col-1];
}

//压缩空间的方法
public int minPathSum2(int[][] m){
if(m==null||m.length==0||m[0]==null||m[0].length==0){
return 0;
}
int row=m.length;
int col=m[0].length;
int less=Math.min(row, col);
int more=Math.max(row, col);
boolean rowmore=more==row;//如果行>=列数,为真;
int[] arr=new int[less];
arr[0]=m[0][0];
for(int i=1;i<less;i++){
arr[i]=arr[i-1]+(rowmore?m[0][i]:m[i][0]);
}
for(int i=1;i<more;i++){
arr[0]=arr[0]+(rowmore?m[i][0]:m[0][i]);
for(int j=1;j<less;j++){
arr[j]=Math.min(arr[j-1],arr[j])+(rowmore?m[i][j]:m[j][i]);
}
}
return arr[less-1];
}

}
0 0
原创粉丝点击