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

题解

  • 固定行数的矩阵的最大值可以压缩成一维数组做,做一维数组时当sum<0则丢弃到已累加的部分。
  • 固定行树为:从起始行i到k行,压缩成一维数组,再遍历列j。时间复杂度由O(n^4)降到O(n^3),因为一维时比较次数降到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;
    }
}

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/11070806.html