您的位置:首页 > 编程语言 > Java开发

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

2016-09-10 09:11 302 查看
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];

}

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