leetcode85-Maximal Rectangle

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;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值