LeetCode-Maximal Rectangle-最大矩形

https://oj.leetcode.com/problems/maximal-rectangle/

一堆0,1矩阵中计算出由1组成的长方形的最大面积。

使用了直方图求最大面积的算法。枚举每一行p,然后在将一行上的所有列看做朝i>p方向出发的直方图,然后在这个直方图上用栈存储递增序列的那个一次遍历算法。最终求得最大值。

class Solution {
public:
    int n,m;
    vector<vector<char> > a;
    vector <int> h;
    int MaxArea(int p){
        for (int i=0;i<m;i++){
            h[i]=0;
            for (int j=p;j<n;j++){
                if (a[j][i]=='0') break;
                h[i]++;
            }
        }
        vector <int> l(m);
        vector <int> r(m);
        stack <int> st;
        for (int i=0;i<m;i++){
            if (st.empty()){
                l[i]=i;
                st.push(i);
                continue;
            }
            if (h[i]>h[st.top()]){
                l[i]=i;
                st.push(i);
                continue;
            }
            while(!st.empty()){
                if (h[i]>h[st.top()]) break;
                l[i]=l[st.top()];
                st.pop();
            }
            st.push(i);
        }
        while(!st.empty()) st.pop();
        for (int i=m-1;i>=0;i--){
            if (st.empty()){
                r[i]=i;
                st.push(i);
                continue;
            }
            if (h[i]>h[st.top()]){
                r[i]=i;
                st.push(i);
                continue;
            }
            while(!st.empty()){
                if (h[i]>h[st.top()]) break;
                r[i]=r[st.top()];
                st.pop();
            }
            st.push(i);
        }
        int res=0;
        for (int i=0;i<m;i++){
            res=max(res,(r[i]-l[i]+1)*h[i]);
        }
        return res;
    }
    int maximalRectangle(vector<vector<char> > &matrix) {
        n=matrix.size();
        a=matrix;
        if (n==0){return 0;}
        m=matrix[0].size();
        int res=0;
        h.resize(m);
        for (int i=0;i<n;i++){
            res=max(res,MaxArea(i));
        }
        return res;
    }
};

  

posted @ 2014-10-08 19:35  zombies  阅读(361)  评论(0编辑  收藏  举报