矩陣最小路徑和(java實現)

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];
}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章