思路:
由于给出的是一个矩阵,那么我们可以把他们抽象成直方图,dpj代表到当前第i行为止、第j列的累计长度。
然后每一行统计完之后求一下直方图的最大面积(单调栈),然后一共求出n行的最大面积,取最大值即可。
如果当前长度大于栈顶长度,那么进栈,否则,例如到第4个长度时,不断出栈,wi代表以第i个长度为高,底边可以扩展的最大长度。出栈的同时,不断累加wi[p],然后再把第四个入栈。这个过程就相当于1 2 3 4个个矩形合并,成了宽为4,高为第4个长度的矩形,这样对后面没有影响。
代码:
class Solution {
public:
int dp[10000+20];
int s[10000+20];//单调栈
int wi[10000+20];//以i为高,底边的最大长度
int n,m;
int ans(int dp[])
{
dp[m]=0;//最后一个为0
int p=0;
int mans=0;
memset(wi,0,sizeof(wi));
memset(s,0,sizeof(s));
for(int i=0;i<=m;i++)
{
if(s[p]<dp[i])
{
s[++p]=dp[i];
wi[p]=1;
}else
{
int len=0;
while(s[p]>dp[i])
{
len+=wi[p];
mans=max(mans,len*s[p]);
p--;
}
s[++p]=dp[i];
wi[p]=len+1;
//p++;
}
}
return mans;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(!matrix.size())return 0;
int maxx=0;
n=matrix.size();
m=matrix[0].size();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
dp[j]=(matrix[i][j]=='1'?dp[j]+1:0);
}
maxx=max(maxx,ans(dp));
}
return maxx;
}
};