int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.size()==0) return 0;//对空向量进行特判
int m=matrix.size(),n=matrix[0].size();//从二维向量中获取行列,当向量为空时,获取列将失败
int A[10000],s=0;
memset(A,0,sizeof(A));
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)//获取以当前行为底的长方形高度A[]
{
if(matrix[i][j]=='1') A[j]++;
else A[j]=0;
}
stack<int> B;
for(int j=0;j<n;j++)//从高度数组中获取当前行的最大面积,用函数形式更好
{
if(B.empty()==true) B.push(j);
else
{
int Top=B.top();
if(A[j]>A[Top]) B.push(j);//仅当当前位置的高度大于栈顶的高度,入栈,A[Top]写出Top这种小错误一直发现不了
else
{
do{
int k=Top;//k表示当前栈顶元素,Top表示下一个栈顶元素,j为即将入栈的元素
B.pop();
Top=B.empty()?-1:B.top();//使用条件表达式更加简洁,每次top()操作前必须判空!!
if(A[j]<=A[k])//此判断可加可不加,1、不加代码更加简洁,2、加了可以稍许减少cpu的计算量,本人更倾向于前者
{
int ss=(j-Top-1)*A[k];
if(ss>s) s=ss;
}
}while(B.empty()==false&&A[j]<=A[Top]);
B.push(j);
}
}
}
if(B.empty()==false)//看似很简单的逻辑,却被empty搞得很烦躁,此段最终可以统一成一个while.怎样把零碎的分支统一起来是我需要考虑的问题。
{
int k,Top;
do
{
k=B.top();
B.pop();
Top=B.empty()?-1:B.top();
int ss=(n-Top-1)*A[k];
if(ss>s) s=ss;
}while(B.empty()==false);
}
}
return s;
}
leetcode85-Maximal Rectangle
最新推荐文章于 2020-03-07 17:50:07 发布