题目描述
给定一个矩阵M,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。(难度:简单,降低空间复杂度)
题解
dp[i][j]表示到达该位置的最小路径和。
- 当i=0,j>0时dp[i][j]=dp[i][j-1]+m[i][j]
- 当j=0,i大于0时dp[i][j]=dp[i-1][j]+m[i][j]
- 当i>0,j>0时dp[i][j]=min(dp[i-1][j],dp[i][j-1])+m[i][j]
- 右下角的值即为最终的结果
- 此时空间复杂度为O(MN),可以降为O(min(M,N))
假设矩阵M由m行,n列构成,如果m≥n,那么生成一个长度为n的数组arr,
- 初始数组中存储第一行的路径和,
- 当遍历第二行元素时,arr[0]=arr[0]+M[1][0],arr[1]=min(arr[0],arr[1])+M[1][1],
- 依次重复此操作,因为下一行的值仅仅依赖于上一行和前一列,与其他位置无关。
- 如果m小于n,那么初始就存储第一列的路径和,依次向右计算。
public int matrixPath(int[][]ma) {
if(ma==null||ma.length==0||ma[0].length==0)
return 0;
int small=Math.min(ma.length,ma[0].length);
int big=Math.max(ma.length,ma[0].length);
int[] midSum=new int[small];
midSum[0]=ma[0][0];
boolean row=big==ma.length;//行大于列
for(int i=1;i<small;i++) {
midSum[i]=midSum[i-1]+(row?ma[0][i]:ma[i][0]);
}
for(int i=1;i<big;i++) {
midSum[0]=midSum[0]+(row?ma[i][0]:ma[0][i]);
for(int j=1;j<small;j++) {
midSum[j]=Math.min(midSum[j-1], midSum[j])+
(row?ma[i][j]:ma[j][i]);
}
}
return midSum[small-1];
}