LeetCode 85. 最大矩形
解题思路:针对矩阵中的每个点,计算以它为矩形右下角的面积。面积的计算,宽度的计算使用一个left二维数组迭代统计计算,高度的计算使用了单调栈,类似LeetCode 85. 最大矩形。
代码实现:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (0 == matrix.size()) return 0;
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> left(m, vector<int>(n, 0));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if ('1' == matrix[i][j]) {
left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;
}
}
}
int res = 0;
for (int j = 0; j < n; ++j) {
vector<int> up(m, 0), down(m, 0);
stack<int> stk;
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 = left[i][j] * height;
res = max(res, area);
}
}
return res;
}
};