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;
}
}