题解
Hard
方法一:动态规划
这道题与84题联系在一起看,完全可以转化成84题的样子。对于每一行,只看其以上的数组元素,把连续的值为1的格子累加起来,就变成 histogram 了。
那么,在每一个值为1的坐标位置上,找到对应的左边界、右边界和上边界(即高度)。遍历一遍,就得到当前数组的最大矩形了。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
int m = matrix.size();
int n = matrix[0].size();
vector<int> height(n, 0), left(n, 0), right(n, n-1);
int maxArea = 0;
for(int i = 0; i < m; i++) {
int cur_left = 0, cur_right = n-1;
// (1) update height[i] namely histogram
for(int j = 0; j < n; j++) {
if(matrix[i][j] == '1') {
height[j]++;
} else {
height[j] = 0;
}
}
// (2) update left[i]
for(int j = 0; j < n; j++) {
if(matrix[i][j] == '1') {
left[j] = max(left[j], cur_left);
} else {
left[j] = 0; // go back to left most
cur_left = j+1;
}
}
// (3) update right[i]
for(int j = n-1; j >= 0; j--) {
if(matrix[i][j] == '1') {
right[j] = min(right[j], cur_right);
} else {
right[j] = n-1; // go back to right most
cur_right = j-1;
}
}
// update maxArea
for(int j = 0; j < n; j++) {
maxArea = max(maxArea, (right[j]-left[j]+1)*height[j] );
}
}
return maxArea;
}
};
方法二: