LeetCode面试题 17.24. 最大子矩阵

    科技2022-07-12  120

    LeetCode面试题 17.24. 最大子矩阵

    题目

    给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。

    返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。

    输入: [ [-1,0], [0,-1] ] 输出:[0,1,0,1] 解释:输入中标粗的元素即为输出所表示的矩阵

    1 <= matrix.length, matrix[0].length <= 200

    解法

    这个题可以看作是LeetCode53题的升维版,从一维数组升级到二维数组。 假设这个二维数组为A,其为m*n的。 有一个一维数组B,为1 * n的 B[j]可以看作是A[p][j]到A[q][j]的和(B是A其中某几行的行求和的数组) 对B进行一维的最大子序列求解,就可以得到目标

    class Solution { public int[] getMaxMatrix(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int[] res = new int[4]; int max = Integer.MIN_VALUE; //对matrix按行求前缀和 for(int i = 0 ; i < m ; ++i){ for(int j = 0 ; j < n ; ++j){ if(i>0){ //matrix[i][j]表示第j列的0-i个元素的和 matrix[i][j]+= matrix[i-1][j]; } } } for(int i = 0 ; i < m ; ++i){ int[] cur = new int[n]; for(int j = i; j < m ; ++j){ for(int k = 0 ; k < n ; ++k){//求某几行的和数组 if(i>0){ cur[k] = matrix[j][k]-matrix[i-1][k]; }else{ cur[k] = matrix[j][k]; } } if(max<cur[0]){ res[0] = i; res[1] = 0; res[2] = j; res[3] = 0; max = cur[0]; } int begin = 0; for(int k = 1 ; k < n ; ++k){ if(cur[k-1]>0){ cur[k] += cur[k-1]; }else{ begin = k; } if(max<cur[k]){ res[0] = i; res[1] = begin; res[2] = j; res[3] = k; max = cur[k]; } } } } return res; } }
    Processed: 0.011, SQL: 8