矩阵最小路径和(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];
}
}
/**
* 矩阵最小路径和
*
*/
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];
}
}
相关文章推荐
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 【LeetCode-面试算法经典-Java实现】【064-Minimum Path Sum(最小路径和)】
- C++实现矩阵图的遍历·最小生成树(prim,kruskal)·最短路径(Dijkstra,floyd)
- 【LeetCode-面试算法经典-Java实现】【064-Minimum Path Sum(最小路径和)】
- 矩阵中的路径(Java实现)
- 矩阵中的路径java实现
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- Java实现-最小路径和
- 剑指offer面试题12:矩阵中的路径(java实现)
- JAVA回溯, 实现 矩阵中的路径寻找问题
- 剑指offer面试题12:矩阵中的路径Java实现版
- 剑指offer2 问题12 矩阵中的路径 Java实现
- 剑指Offer面试题66:矩阵中的路径 java实现
- 单源最短路径、最小生成树及堆的Java实现
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 利用Java实现压缩与解压缩(zip、gzip)支持中文路径
- 最小生成树与最短路径的区别以及实现方法
- 利用Java实现压缩与解压缩(zip、gzip)支持中文路径
- Android 利用Java实现压缩与解压缩(zip、gzip)支持中文路径
- 最小生成树与最短路径的区别以及实现方法