85. 最大矩形
hard
[1]分析:此题是之前那道的 84.直方图中最大的矩形 的扩展,这道题的二维矩阵每一层向上都可以看做一个直方图,输入矩阵有多少行,就可以形成多少个直方图,对每个直方图都调用 84.直方图中最大的矩形 中的方法,就可以得到最大的矩形面积。那么这道题唯一要做的就是将每一层构成直方图,由于题目限定了输入矩阵的字符只有 ‘0’ 和 ‘1’ 两种,所以处理起来也相对简单。方法是,对于每一个点,如果是‘0’,则赋0,如果是 ‘1’,就赋 之前的height值加上1。
我的理解是先是第一行形成的直方图,然后是第一二行形成的直方图,然后是第一二三行形成的直方图,以此类推
16 ms:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty())return 0;
vector<int>height(matrix[0].size(),0);
int res = 0;
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[0].size(); j++)
{
height[j] = (matrix[i][j] == '0' ? 0 : (height[j] + 1));
}
res = max(res, largestRectangleArea(height));
}
return res;
}
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
int res = 0;
// insert 0 height为了方便最后一个处理
heights.push_back(0);
stack<int>T;
for (int i = 0; i < heights.size(); i++)
{
if (T.empty() || heights[T.top()] <= heights[i])
T.push(i);
else
{
int top = T.top(); T.pop();
res = max(res, heights[top] * (T.empty() ? i : (i - T.top() - 1)));
i--;
}
}
return res;
}
};