[程序员代码面试指南]数组和矩阵-子矩阵的最大累加和问题

题解

  • 固定行数的矩阵的最大值可以压缩成一维数组做,做一维数组时当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;
	}
}
原文地址:https://www.cnblogs.com/coding-gaga/p/11070806.html