您的位置:首页 > 其它

Maximal Rectangle

2015-07-17 22:07 337 查看
思路:

方法一:时间复杂度O(N^2),空间复杂度O(1)。

依据上一题
Largest Rectangle in Histogram
的思路,可以将给定的matrix转化为包含矩形信息的数组。

例如:

将matrix =

0 1 1 0 1
1 1 0 1 0
0 0 1 1 0
1 1 1 1 0
0 0 0 0 0


转化为:

0 1 1 0 1 
1 2 0 1 0 
0 0 1 2 0 
1 1 2 3 0 
0 0 0 0 0


然后对每一行计算一次最大矩形面积,选最大的。

class Solution {
private:
    int calculate_area(vector<int>& line) {
        stack<int> s;
        line.push_back(0);
        int ans = 0;
        for(int i = 0; i < line.size();) {
            if(s.empty() || line[i] > line[s.top()]) {
                s.push(i);
                ++i;
            }else {
                int tmp = s.top();
                s.pop();
                ans = max(ans, line[tmp] * (s.empty() ? i : i - s.top() - 1));
            }
        }
        return ans;
    }
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty()) return 0;
        //convert problem
        int m = matrix.size();//m rows
        int n = matrix[0].size();//n cols
        vector<vector<int>> line = vector<vector<int>>(m, vector<int>(n, 0));
        for(int i = 0; i < m; ++i) {
            for(int j = 0; j < n; ++j) {
                if(i == 0) {
                    line[i][j] = ((matrix[i][j] == '1') ? 1 : 0);
                }else {
                    line[i][j] = (matrix[i][j] == '1' ? (line[i - 1][j] + 1) : 0);
                }
            }
        }
        //calculate every row
        int max_area = 0;
        for(int i = 0; i < m; ++i) {
            max_area = max(max_area, calculate_area(line[i]));
        }
        return max_area;
    }
};


方法二:时间复杂度O(N),空间复杂度O(1)。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: