【LeetCode 85]最大矩形

トピックリンク

[説明]


m個のクラスにすべて「1」の長方形。
長方形j番目のクラス。彼の右の列jとの国境に近いです。
まあ。
我々セットF [i] [j]が残され、この点(i、j)の最大を表す「1」がどのように多くのオブジェクトによって拡張することができる
j番目のクラスの矩形なります。
我々は見つけるでしょう。質問の中に、ヒストグラムの横に置くことを求めて。
そして、どこ最大の矩形領域を見つけるためにあなたを聞かせて。そして、近い底面(すなわち列j)に必要と
その後に巻き込ま質問この質問まで。
O(N)が単調キューを解決することができることを確認します。
したがって、全体的な複雑さはO(N ^ 2)です。

[コード]

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if (matrix.empty()) return 0;
        if (matrix[0].empty()) return 0;
        int n = matrix.size();
        int m = matrix[0].size();
        int f[1005][1005];
        memset(f,0,sizeof(f));
        for (int i = 0;i < n;i++)
            for (int j = 0;j < m;j++){
                if (matrix[i][j]=='1'){
                    f[i+1][j+1] = f[i+1][j]+1;
                }
            }
        int h[1005],sta[1005];
        memset(h,0,sizeof(h));memset(sta,0,sizeof(sta));
        int top;
        int ma = 0;
        for (int j = 1;j <= m;j++){
            for (int i = 1;i <= n;i++){
                h[i] = f[i][j];
            }
            top = 1;
            sta[1] = 0;
            for (int i = 1;i <= n;i++){
                while (top!=1 && h[sta[top]]>h[i]){
                    ma = max(ma,h[sta[top]]*(i-1-sta[top-1]));
                    top--;
                }
                sta[++top] = i;
            }
            while (top>1){
                ma = max(ma,h[sta[top]]*(n-sta[top-1]));
                top--;
            }
        }
        return ma;
    }
};

おすすめ

転載: www.cnblogs.com/AWCXV/p/11944514.html