class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
//矩阵行数 m
int m = matrix.size();
if (m == 0) {
return 0;
}
//矩阵的第0行size 即是列数
int n = matrix[0].size();
//初始化 m行 n列的0矩阵 left
vector<vector<int>> left(m, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
//当该点为1时
if (matrix[i][j] == '1') {
//若j是0 则 left[i][j]=0+1 若j!=0,left[i][j]=left[i][j - 1] + 1 计算长度
left[i][j] = (j == 0 ? 0: left[i][j - 1]) + 1;
}
}
}
int ret = 0;
for (int j = 0; j < n; j++) { // 对于每一列,使用基于柱状图的方法
vector<int> up(m, 0), down(m, 0);
stack<int> stk;
//类似于84的单调栈
for (int i = 0; i < m; i++) {
while (!stk.empty() && left[stk.top()][j] >= left[i][j]) {
stk.pop();
}
up[i] = stk.empty() ? -1 : stk.top();
stk.push(i);
}
stk = stack<int>();
for (int i = m - 1; i >= 0; i--) {
while (!stk.empty() && left[stk.top()][j] >= left[i][j]) {
stk.pop();
}
down[i] = stk.empty() ? m : stk.top();
stk.push(i);
}
for (int i = 0; i < m; i++) {
int height = down[i] - up[i] - 1;
int area = height * left[i][j];
ret = max(ret, area);
}
}
return ret;
}
};