Maximal Rectangle

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.

这题目是:是Largest Rectangle in Hisgoram的升级版本。

              只要那个问题解决了,然后for int i = 0 to i < n 然后根据子矩阵抽象成直方图的方式 最后可以解决

              O(n*n) 或者 O(n*n*logn)

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(!matrix.size())
            return 0;
        int start, largest = 0;
        vector<int> left(matrix[0].size(), 0);
        vector<int> right(matrix[0].size(), 0);
        vector<int> height(matrix[0].size(), 0);
        for(int i = 0; i < matrix.size(); i++)
        {
            left[0] = 0;
            right[matrix[0].size() - 1] = matrix[0].size() - 1;
            
            for(int j = 0; j < matrix[0].size(); j++)
                if(matrix[i][j] == '1')
                    height[j] += 1;
                else
                    height[j] = 0;
            
            for(int j = 1; j < matrix[0].size(); j++)
            {
                start = j;
                while(start > 0 && height[j] <= height[start-1])
                    start = left[start-1];
                left[j] = start;
            }
        
            for(int j = matrix[0].size() - 2; j >= 0; j--)
            {
                start = j;
                while(start < height.size()-1 && height[j] <= height[start+1
])
                    start = right[start+1];
                right[j] = start;
            }
        
            for(int j = 0; j < matrix[0].size(); j++)
            {
                int temp = (right[j] - left[j] + 1) * height[j];
                if(temp > largest)
                    largest = temp;
            }
        }
        return largest;
    }
};

 

posted @ 2013-09-04 14:21  一只会思考的猪  阅读(223)  评论(0编辑  收藏  举报