要求:给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
思路:
法一:暴力,会超时。首先算出每个点左边的1(含点本身)的数量,然后以每个点为矩形右下角,枚举其高度即可
法二:单调栈。对每一列应用单调栈,当作84题
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
vector<int> heights(matrix[0].size(), 0);
int maxArea = 0;
for (vector<char>& row : matrix)
{
for (int i = 0; i < row.size(); ++ i)
{
if (row[i] == '0') heights[i] = 0; //当前格子为0,则它所在的柱子高度为0
else heights[i] ++ ; //格子为1,则它的高度为上一行同位置高度+1
}
//每遍历完一行,就计算以这行为基线的直方图最大面积
maxArea = max(maxArea, largestRectangleArea(heights));
}
return maxArea;
}
//使用单调栈求直方图最大矩形面积的方法
int largestRectangleArea(vector<int>& heights) {
stack<int> stk;
stk.push(-1);
int maxArea = 0;
for (int i = 0; i < heights.size(); ++ i)
{
while (stk.top() != -1 && heights[stk.top()] > heights[i])
{
int height = heights[stk.top()];
stk.pop();
int width = i - stk.top() - 1;
maxArea = max(maxArea, height * width);
}
stk.push(i);
}
while (stk.top() != -1)
{
int height = heights[stk.top()];
stk.pop();
int width = heights.size() - stk.top() - 1;
maxArea = max(maxArea, height * width);
}
return maxArea;
}
};