[程序员代码面试指南]数组和矩阵-子矩阵的最大累加和问题
题解
- 固定行数的矩阵的最大值可以压缩成一维数组做,做一维数组时当sum<0则丢弃到已累加的部分。
- 固定行树为:从起始行i到k行,压缩成一维数组,再遍历列j。时间复杂度由O(n4)降到O(n3),因为一维时比较次数降到O(n)。
代码
public class Main {
public static void main(String args[]) {
int[][] m= {{-90,48,78},{64,-40,64},{-81,-7,66}};
System.out.println(maxMatrixSum(m));
}
public static int maxMatrixSum(int[][] m) {
if(m.length==0||m[0].length==0) {
return 0;
}
int max=Integer.MIN_VALUE;
for(int i=0;i<m.length;++i) {
int[] arr=new int[m[0].length];
for(int k=i;k<m.length;++k) {
int sum=0;//
for(int j=0;j<m[0].length;++j) {
arr[j]+=m[k][j];
sum=sum+arr[j];//分开做
sum=sum<0?0:sum;//
}
max=sum>max?sum:max;
}
}
return max;
}
}
posted on 2019-06-22 22:58 coding_gaga 阅读(120) 评论(0) 编辑 收藏 举报