给定一个正整数、负整数和 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-submatrix-lcci
思路:
枚举起始行和结束行,将每列的数相加,可得到一个序列,利用最大子序列和的思路,可获得最大子矩阵
复杂度分析:
时间复杂度O(n)
空间复杂度O(n)
var getMaxMatrix = function (matrix) {
let n = matrix.length;
let m = matrix[0].length;
let d = new Array(m).fill(0);
let maxSum = -Infinity;
let r1, c1;
let ans, sum;
for (let i = 0; i < n; i++) {
for (let t = 0; t < m; t++) d[t] = 0;
for (let j = i; j < n; j++) {
sum = 0;
for (let k = 0; k < m; k++) {
d[k] += matrix[j][k];
if (sum > 0) {
sum += d[k];
} else {
sum = d[k];
r1 = i;
c1 = k;
}
if (sum > maxSum) {
maxSum = sum;
ans = [r1, c1, j, k];
}
}
}
}
return ans;
};