最大子矩阵

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

 

#include <vector>

using namespace std;

class Solution {
public:
    vector<int> getMaxMatrix(vector<vector<int>> &matrix) {

        int m = matrix.size();
        int n = matrix[0].size();
        int maxV = matrix[0][0];
        int maxX1 = 0;
        int maxY1 = 0;
        int maxX2 = 0;
        int maxY2 = 0;
        for (int i = 0; i < m; ++i) {
            vector<int> temp(n, 0);
            for (int j = i; j < m; ++j) {
                for (int k = 0; k < n; ++k) {
                    temp[k] += matrix[j][k];
                }
                int maxPre = temp.front();
                int l = 0;
                for (int k = 1; k < n; ++k) {
                    if (maxPre < 0) {
                        maxPre = temp[k];
                        l = k;
                    } else {
                        maxPre = maxPre + temp[k];
                    }
                    if (maxPre > maxV) {
                        maxV = maxPre;
                        maxX1 = i;
                        maxX2 = j;
                        maxY1 = l;
                        maxY2 = k;
                    }
                }
            }
        }
        return vector<int>{maxX1, maxY1, maxX2, maxY2};
    }
};

int main() {
    vector<vector<int>> nums{{-1, 0},
                             {0,  -1}};
    Solution s;
    s.getMaxMatrix(nums);

}

 

posted on 2021-03-04 18:36  QzZq  阅读(104)  评论(0)    收藏  举报

导航