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
解题思路
这道题的解题思路和前面的84题相近(Largest Rectangle in Histogram),可以理解为将此题中的二维数组的每一行当做是84题中的一维的高度统计数组,那么统计二维矩阵中面积最大的长方形,就可以转变为先求每一个一维统计数组的最大矩形面积,然后求所有统计数组求得的矩形的面积的最大值。
具体算法如下:
1.建立记录数组dp[n][m+1],此处的m+1是为了求最大矩形面积时能够有一个终止位置(类似84题),所以要比原二维数组多一列
2.每一个统计数组的元素的值为该位置所对应的二维数组的列从当前行往上遍历能够得到的最长连续“1”序列的长度,若没有连续“1”序列,则赋为0。
3.利用84题中计算最大矩形面积的算法为每一个统计数组记录它能得到的最大矩形面积(84题算法)
4.取(3)中得到的所有矩形面积中的最大值作为最终答案
C++代码
class Solution {
public:
int calculateMaxArea(vector<int>& heights) {
stack<int> rec;
int res = 0;
for(int i = 0; i < heights.size();) {
if(rec.empty() || heights[rec.top()] <= heights[i]) {
rec.push(i);
i++;
}
else {
int r = rec.top();
rec.pop();
res = max(res, heights[r] * (rec.empty()? i : i - rec.top() - 1));
}
}
return res;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0)
return 0;
vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size()+1));
int res = 0;
for(int i = 0; i < matrix[0].size(); i++) {
dp[0][i] = matrix[0][i] == '0'? 0 : 1;
for(int j = 1; j < matrix.size(); j++) {
dp[j][i] = matrix[j][i] == '1'? dp[j-1][i]+1 : 0;
}
}
for(int i = 0; i < dp.size(); i++) {
int r = calculateMaxArea(dp[i]);
res = max(res, r);
}
return res;
}
};