LeetCode 85. Maximal Rectangle

class Solution {
public:
    int method(vector<int> h)//求柱状图中最大的矩形
    {
        int n=h.size();
        vector<int> l=vector<int> (n),r=l;
        stack<int> st;
        //预处理l,r数组
        for(int i=0;i<n;i++)
        {
            while(st.size()&&h[st.top()]>=h[i])  st.pop();
            if(st.size())   l[i]=st.top(); 
            else l[i]=-1;  //没有比h[i]小的数
            st.push(i);
        }
        st=stack<int> ();
        for(int i=n-1;i>=0;i--)
        {
            while(st.size()&&h[st.top()]>=h[i])  st.pop();
            if(st.size())   r[i]=st.top(); 
            else r[i]=n;  //没有比h[i]小的数
            st.push(i);
        }
        //计算最大矩形面积
        int res=0;
        for(int i=0;i<n;i++)
            res=max(res,h[i]*(r[i]-l[i]-1));
        return res;
    }
    int maximalRectangle(vector<vector<char>>& matrix) {
        int n=matrix.size(),m=matrix[0].size(); 
        vector<vector<int> > h=vector<vector<int> > (n,vector<int> (m));
        //初始化h[i][j],表示matrix[i][j]在j列从i行往上数,1的个数
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if('0'==matrix[i][j])   h[i][j]=0;
                else if(i)  h[i][j]=1+h[i-1][j];
                else h[i][j]=1;
            }
        //枚举每一行
        int res=0;
        for(int i=0;i<n;i++)
            res=max(res,method(h[i]));
        return res;
    }
};
posted @   穿过雾的阴霾  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示