最大子矩阵

面试题17.24 最大子矩阵

题目描述

给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。

返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可

说明

\(1 <= matrix.length, matrix[0].length <= 200\)

示例

输入:

[

​ [-1,0],

​ [0,-1]

]

输出: [0,1,0,1]

思路

图片来源B站UP zjutsunny

捕获.JPG

代码

class Solution {
public:
    vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
        int row=matrix.size();
        int col=matrix[0].size();
        vector<int> ans(4,0);
        vector<vector<int>> prefixSUM(row+1,vector<int>(col,0));
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
                prefixSUM[i+1][j]=prefixSUM[i][j]+matrix[i][j];
        }
        int tmp=INT32_MIN;
        for(int up_cursor=0; up_cursor < row; up_cursor++)
        {
            for(int down_cursor=up_cursor; down_cursor < row; down_cursor++)
            {
                int dp=INT32_MIN;
                int left_cursor=0;
                for (int right_cursor=0; right_cursor < col; ++right_cursor)
                {
                    if(dp>0)
                    {
                        dp+= prefixSUM[down_cursor + 1][right_cursor] - prefixSUM[up_cursor][right_cursor];
                    }
                    else
                    {
                        left_cursor=right_cursor;
                        dp= prefixSUM[down_cursor + 1][right_cursor] - prefixSUM[up_cursor][right_cursor];
                    }
                    if(dp>tmp)
                    {
                        tmp=dp;
                        ans={up_cursor, left_cursor, down_cursor, right_cursor};
                    }
                }
            }
        }
        return ans;
    }
};
posted @ 2020-09-03 22:04  周颖  阅读(12)  评论(0)    收藏  举报