面试题 17.24. 最大子矩阵
给定一个正整数、负整数和 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 1074. 元素和为目标值的子矩阵数量–map+前缀和。
感觉也比较简单。
AC代码
class Solution {
public:
int col[205][205];
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
memset(col,0,sizeof(col));
for(int i=0;i<matrix.size();i++)
{
for(int j=0;j<matrix[0].size();j++)
{
col[i+1][j+1]=col[i][j+1]+matrix[i][j];
}
}
int mx=-1e9,L1,R1,L2,R2;
for(int i1=1;i1<=matrix.size();i1++)
{
for(int i2=i1;i2<=matrix.size();i2++)
{
int mi=0;
int ans=0;
int jx=0;
for(int j=1;j<=matrix[0].size();j++)
{
ans+=(col[i2][j]-col[i1-1][j]);
if(ans-mi>mx)
{
mx=ans-mi;
L1=i1-1,R1=jx;
L2=i2-1,R2=j-1;
}
if(ans<mi)
{
mi=ans;
jx=j;
}
}
}
}
vector<int>q;
q.push_back(L1);
q.push_back(R1);
q.push_back(L2);
q.push_back(R2);
return q;
}
};
|