[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