Description
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
分析
题目的意思是:求一个二维矩阵中最大的只由1组成的矩形。
- 因为我们要找的是矩形,所以它一定是以 某个行元素开始的,这样的话,其实我们要找到的某个矩形就转换成 一某一个行开始的 histogram的最大矩形问题了。
- 第一行表示,我们以第一行作为底边,所形成的 histogram的高度,其他行也类似。所以问题变成了 枚举每一行,然后求出每一行对应的histogram的最大矩形。
例如
01101
11010
01110
11110
11111
先将上面的矩阵转化(看代码的temp计算)为:
01101
12010
03110
14210
25321
然后对每一行求直方图的最大面积。
代码
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.size()==0){
return 0;
}
int rows=matrix.size();
int cols=matrix[0].size();
vector<int> temp(cols,0);
int sum=0;
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
temp[j]=matrix[i][j]-'0'+(matrix[i][j]-'0')*temp[j];
}
sum=max(sum,largestRectangleArea(temp));
}
return sum;
}
int largestRectangleArea(vector<int> &height){
int max_area=0;
for(int i=0;i<height.size();i++){
int MIN=height[i];
for(int j=i;j<height.size();j++){
MIN=min(height[j],MIN);
int CurArea=MIN*(j-i+1);
if(CurArea>max_area){
max_area=CurArea;
}
}
}
return max_area;
}
};
参考文献
[编程题]maximal-rectangle
[LeetCode] 01矩阵中最大矩形 Maximal Rectangle
Leetcode Maximal Rectangle