原题链接:最大矩形
个人解法
直接暴力用了二维前缀和,果不其然超时了,没想到这是上一题的一个扩展。。
题解
思路:
这道题我们可以看成是 84-柱状图中最大的矩形的一个扩展,如果我们把每一行当作一个“地平线”,那么每一行都有1组成的柱体的序列,那么问题就转换为了对每一行来说,求以该行为“地平线”的柱状图中最大的矩形。
时间复杂度: O ( m n ) O(mn) O(mn)
代码:
class Solution {
public:
int h[410][410];
int left[410][410];
int right[410][410];
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
for(int row = 0;row < m;row ++) {
for(int i = 0;i < n;i ++) {
if(!row) {
h[row][i] = matrix[row][i] - '0';
continue;
}
if(matrix[row][i] == '1') h[row][i] = 1 + h[row - 1][i];
}
}
for(int row = 0;row < m;row ++) {
for(int i = 0;i < n;i ++) right[row][i] = n;
}
int res = 0;
for(int row = 0;row < m;row ++) {
stack<int> stk;
for(int i = 0;i < n;i ++) {
while(stk.size() && h[row][stk.top()] >= h[row][i]) {
right[row][stk.top()] = i;
stk.pop();
}
left[row][i] = stk.size() ? stk.top() : -1;
stk.push(i);
}
for(int i = 0;i < n;i ++)
res = max(res, (right[row][i] - left[row][i] - 1) * h[row][i]);
}
return res;
}
};