给定一个正整数、负整数和 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)

    1. var getMaxMatrix = function (matrix) {
    2. let n = matrix.length;
    3. let m = matrix[0].length;
    4. let d = new Array(m).fill(0);
    5. let maxSum = -Infinity;
    6. let r1, c1;
    7. let ans, sum;
    8. for (let i = 0; i < n; i++) {
    9. for (let t = 0; t < m; t++) d[t] = 0;
    10. for (let j = i; j < n; j++) {
    11. sum = 0;
    12. for (let k = 0; k < m; k++) {
    13. d[k] += matrix[j][k];
    14. if (sum > 0) {
    15. sum += d[k];
    16. } else {
    17. sum = d[k];
    18. r1 = i;
    19. c1 = k;
    20. }
    21. if (sum > maxSum) {
    22. maxSum = sum;
    23. ans = [r1, c1, j, k];
    24. }
    25. }
    26. }
    27. }
    28. return ans;
    29. };