题目描述
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] 输出: 6
问题分析
此题和上一题的扩展,此题给的二维矩阵的每一行向上都形成了一个直方图,所以二维矩阵有多少行,就有多少个直方图。我们用height数组来保存当前行的直方图的高度信息,同上一题思想一样,height数组要在尾部加上一个元素0。在遍历当前行更新height数组时,如果当前元素为字符0,则高度为0;如果当前字符为1,则高度为上一行该位置的高度加1。在更新完height数组后,计算当前行直方图的最大矩形面积,这部分就和上一道题一模一样了。二维矩阵的每一行都对应着一个向上形成的直方图的最大矩形面积,最后返回其中的最大值。
代码实现
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty())
return 0;
int maxsize = 0;
vector<int> height(matrix[0].size() + 1, 0);
for(int i = 0; i < matrix.size(); i++){
for(int j = 0; j < matrix[0].size(); j++)
if(matrix[i][j] == '0')
height[j] = 0;
else
height[j] += 1;
stack<int> sta;
int m = 0;
while(m < height.size()){
if(sta.empty() || height[m] >= height[sta.top()]){
sta.push(m);
m++;
}
else{
int temp = sta.top();
sta.pop();
maxsize = max(maxsize, height[temp] * (sta.empty()? m : (m - sta.top() - 1)));
}
}
}
return maxsize;
}
};