class Solution {
public:
int f(vector<int> &v) {
int n = v.size();
vector<int> left(n);
vector<int> right(n);
for (int i = 0; i < n; i++) {
left[i] = i;
right[i] = i;
}
for (int i = 1; i < n; i++) {
int j = i;
while (j > 0 && v[i] <= v[j - 1])
j = left[j - 1];
left[i] = j;
}
for (int i = n - 2; i >= 0; i--) {
int j = i;
while (j < n - 1 && v[i] <= v[j + 1])
j = right[j + 1];
right[i] = j;
}
int ret = 0;
for (int i = 0; i < n; i++)
ret = max(ret, v[i] * (right[i] - left[i] + 1));
return ret;
}
int maximalRectangle(vector<vector<char> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m = matrix.size();
if (m == 0) return 0;
int n = matrix[0].size();
if (n == 0) return 0;
vector<vector<int> > mat(m, vector<int>(n));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
mat[i][j] = matrix[i][j] - '0';
for (int j = 0; j < n; j++)
for (int i = 1; i < m; i++)
if (mat[i][j]) mat[i][j] += mat[i - 1][j];
int ret = 0;
for (int i = 0; i < m; i++)
ret = max(ret, f(mat[i]));
return ret;
}
};
Small Case: 12ms
Large Case: 60ms
Time: O(lgn * n^2)
Space: O(n^2)
实际上为 Largest Rectangle in Histogram 的变形题。