https://leetcode-cn.com/problems/maximal-rectangle/
分析
本题可看做“最大广告牌”题的变式,只需枚举以每一行为“地面”,每一列上连续“1”个数为“建筑物高度”,所有枚举中的“最大广告牌”面积即可。采用单调队列算法,记录每个点可向左右延伸的距离为长度,即记录每个点左右第一个比它的“当前高度”小的“建筑物坐标”,以该点“建筑物高度”为宽度,即可求出此时的“广告牌面积”。枚举每一列得到的最大“广告牌面积”即为本题所求解。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int rows=matrix.size();
if(rows==0)return 0;
int lr=matrix[0].size(),ans=0,juzhen[210][210]={0};
for(int i=0;i<rows;i++)
{
if(i==0)
{
for(int j=0;j<lr;j++)
{
juzhen[i][j]=matrix[i][j]-'0';
}
}
else
{
for(int j=0;j<lr;j++)
{
if(matrix[i][j]=='1')juzhen[i][j]=juzhen[i-1][j]+matrix[i][j]-'0';
}
}
}
for(int i=0;i<rows;i++)
{
for(int j=0;j<lr;j++)cout<<juzhen[i][j]<<" ";
cout<<endl;
}
cout<<endl;
if(lr==1)
{
for(int j=0;j<rows;j++)
{
ans=max(ans,juzhen[j][0]);
}
return ans;
}
for(int row=0;row<rows;row++)
{
int pre[210]={0},next[210]={0},r=0,q[210]={0},i=2;
pre[0]=-1;
q[0]=0;
if(juzhen[row][1]<=juzhen[row][q[r]])
{
q[0]=1;
pre[1]=-1;
}
else{
q[++r]=1;
pre[1]=0;
}
while(i<lr)
{
while(r>=0&&juzhen[row][i]<=juzhen[row][q[r]])r--;
if(r==-1)pre[i]=-1;
else pre[i]=q[r];
q[++r]=i;
i++;
}
int daozhi[210]={0};
for(int j=0;j<lr;j++)daozhi[j]=juzhen[row][lr-j-1];
i=2,r=0,q[0]=0,next[lr-1]=lr;
if(daozhi[1]<=daozhi[q[r]])
{
q[0]=1;
next[lr-1-1]=lr;
}
else
{
q[++r]=1;
next[lr-1-1]=lr-1;
}
while(i<lr)
{
while(r>=0&&daozhi[i]<=daozhi[q[r]])r--;
if(r==-1)next[lr-1-i]=lr;
else next[lr-1-i]=lr-1-q[r];
q[++r]=i;
i++;
}
for(int k=0;k<lr;k++)cout<<pre[k]<<" ";
cout<<endl;
for(int k=0;k<lr;k++)cout<<next[k]<<" ";
cout<<endl;
cout<<endl;
for(int j=0;j<lr;j++)
{
int rec=(next[j]-pre[j]-1)*juzhen[row][j];
if(rec>ans)ans=rec;
}
}
return ans;
}
};