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 的最大矩形,并返回其面积。 示例: 输入:
|
思路:接着上一题: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;
}
};