给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。
注意:本题相对书上原题稍作改动
示例:
输入:
[
[-1,0],
[0,-1]
]
输出:[0,1,0,1]
解释:输入中标粗的元素即为输出所表示的矩阵
java代码:
class Solution {
public int[] getMaxMatrix(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
// 用于暂存矩阵的列和
int[] sum = new int[n];
int[] ans = new int[4];
int maxAns = matrix[0][0];
for(int i=0;i<m;i++){
// 重置列和
for(int t=0;t<n;t++) sum[t] = 0;
for(int j=i;j<m;j++){
// start 记录最大连续数组子序的开始位置
int maxSum = 0, start = 0;
for(int k=0;k<n;k++){
// sum[k] 表示 矩阵中 i ~ j 行 k 列元素的和
sum[k] += matrix[j][k];
// 动态规划求sum数组中最大的连续子序之和
if(maxSum > 0){
maxSum += sum[k];
}else{
maxSum = sum[k];
start = k;
}
if(maxSum > maxAns){
ans[0] = i; ans[1] = start;
ans[2] = j; ans[3] = k;
maxAns = maxSum;
}
}
}
}
return ans;
}
}