【题目】
给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
【举例】
如果给定m:
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
路径1,3,1,6,1,0即为所求,返回12
【代码】
public static void main(String[] args) {
int[][] m={{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}};
System.out.println(minPathSum(m));//12
System.out.println(minPathSum2(m));//12
}
//矩阵的最小路径和
//方法一,时间复杂度O(M×N),空间额外复杂度O(M×N)
public static int minPathSum(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];
//生成dp第一列元素
for(int i=1;i<row;i++){
dp[i][0]=dp[i-1][0]+m[i][0];
}
//生成dp第一行元素
for(int i=1;i<col;i++){
dp[0][i]=dp[0][i-1]+m[0][i];
}
//生成dp其他元素,dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+m[i][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];//右下角的值
}
//方法二,时间复杂度O(M×N),空间额外复杂度O(min{M,N})
public static int minPathSum2(int[][] m){
if(m==null||m.length==0||m[0]==null||m[0].length==0){
return 0;
}
int more=Math.max(m.length, m[0].length);//行数和列数较大的为more
int less=Math.min(m.length, m[0].length);//行数和列数较小的为less
boolean rowmore=more==m.length;//行数是否大于列数
int[] arr=new int[less];//辅助数组的长度仅为行数与列数中的最小值
arr[0]=m[0][0];
for(int i=1;i<less;i++){//假设行数大于列数,则arr[i]为(0,0)到(0,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];
}
寻找矩阵最小路径和的算法
这是一篇关于计算矩阵中最短路径和的问题,从左上角出发,只能向右或向下移动,直到右下角,目标是找到路径上数字之和最小的路径。例如,给定一个特定矩阵,最小路径和为12。文章可能包含解决这个问题的代码实现。
1015

被折叠的 条评论
为什么被折叠?



