leetcode-85. Maximal Rectangle 最大矩形

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

Example:

Input:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
Output: 6

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6

思路:接着上一题:Largest Rectangle in Histogram 的思路,这个题目也就是以每行为底算一次直方图最大矩形。先要向上计算第i行直方图,由题目中0,1判断即可。然后直接用上一题的思路就可以。

class Solution1 {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int res=0;
        vector<int> height;
        for(int i=0;i<matrix.size();++i)
        {
            height.resize(matrix[0].size());
            for(int j=0;j<matrix[0].size();++j)
            {
                height[j]= matrix[i][j]=='0'?0:height[j]+1;
            }
            res=max(res,rectangle(height));
        }
        return res;
    }
    int rectangle(vector<int> & height)
    {
        int res=0;
        for(int i=0;i<height.size();++i)
        {
            if(i+1<height.size() && height[i]<=height[i+1])  //先判断i是否出边界
                continue;
            int mn=height[i];
            for(int j=i;j>=0;j--)
            {
                mn=min(mn,height[j]);
                res=max(res,mn*(i-j+1));
            }
        }
        return res;
    }
};
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if (matrix.empty() || matrix[0].empty()) return 0;
        int res = 0, m = matrix.size(), n = matrix[0].size();
        vector<vector<int>> h_max(m, vector<int>(n));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (matrix[i][j] == '0') continue;
                if (j > 0) h_max[i][j] = h_max[i][j - 1] + 1;
                else h_max[i][0] = 1;
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (h_max[i][j] == 0) continue;
                int mn = h_max[i][j];
                res = max(res, mn);
                for (int k = i - 1; k >= 0 && h_max[k][j] != 0; --k) {
                    mn = min(mn, h_max[k][j]);
                    res = max(res, mn * (i - k + 1));
                }
            }
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_21997625/article/details/91128932
今日推荐