第四章:多維陣列和矩陣 ------------- 4.8 子矩陣的最大累加和

Curtis_發表於2019-03-17

題目:

給定一個矩陣matrix,其中的值有正、有負、有0,返回子矩陣的最大累加和。

例如,matrix為:
-1  -1  -1 
-1   2   2
-1  -1  -1
其中最大累加的子矩陣為:2  2,所以返回 4

 思路:

解法一:暴力破解,查詢出所有的子矩陣,時間複雜度太高了,不可取。
解法二:假定只有一行,那就跟求最大和子陣列一樣。
              如果限定兩行,可以把兩行按列求和,
              同上所有我們從把第一行當做起點,依次累加後面的每一行後,都求一個最大子陣列和 。
              以第二行作為起點,依次累加後面的每一行後,都求一個最大子陣列和 每次求出來的和與歷史最大值比較,如果更大,則更新 。
Arrays.fill(arr, 0);//快速地將arr的每個元素都設定為0。

程式碼:

import java.util.Arrays;

public class MaxSubMatrix {

    static int maxSum(int [][]matrix){
        int beginRow = 0;// 以它為起始行
        
        final int M = matrix.length;
        final int N = matrix[0].length;
        
        int []sums = new int[N]; // 按列求和
        int max = 0;  // 歷史最大的子矩陣和
        while(beginRow<M){  
            for (int i = beginRow; i < M; i++) {
                // 按列累加
                for (int j = 0; j < N; j++) {
                    sums[j] += matrix[i][j];
                }
                // 累加完成,呼叫上一篇部落格求最大子陣列累加和的方法
                int t = MaxSubArray.findByDp(sums);
                if (t>max) {
                    max = t;
                }
            }
            //另起一行,作為起始行,sums 清零
            Arrays.fill(sums, 0);  // 快速地將sums的每個元素都設定為0
            beginRow++;
        }
        return max;
    }
    
    public static void main(String[] args) {
        int[][] matrix = {
                {-90, 48, 78},
                {64, -40, 64},
                {-81, -7, 66}
            };
            matrix = new int[][]{{1, 2, -1}};
            int res = maxSum(matrix);
            System.out.println(res);
    }

}

結果:

來源:https://www.cnblogs.com/xiaoyh/p/10295486.html

相關文章