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
思路:
将题目转化为Largest Rectangle in Histogram,每一行和其上面的数组可以看成一个直方图,连1个数是直方图的高。
以上面的input的第二行为例,生成的直方图为:
2 | 0 | 2 | 1 | 0 |
只要统计出每行对应的直方图就可以通过寻找直方图中最大矩形的方法求出。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.empty())
return 0;
int n = heights.size();
vector<int> area;
for(int i=0;i<n;i++){
int j=i;
int length=0;
while(j<n && heights[i]<=heights[j]){
length++;
j++;
}
int k=i-1;
while(k>=0 && heights[i]<=heights[k]){
length++;
k--;
}
area.push_back(heights[i]*length);
}
int max_area= *max_element(area.begin(),area.end());
return max_area;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty() || matrix[0].empty())
return 0;
int m = matrix.size();
int n = matrix[0].size();
int max_rectangle=0;
for(int i=0;i<m;i++){
vector<int> v(n,0);
for(int j=0;j<n;j++){
int k=i;
while(k>=0 && matrix[k][j]=='1'){
v[j]++;
k--;
}
}
max_rectangle=max(max_rectangle,largestRectangleArea(v));
}
return max_rectangle;
}
};