用f[i][j]表示第i行第j列的元素,从它开始到最右侧,连续为“1”的长度。O(n^2)的算法可求出。
再次遍历整个矩阵,对于每个元素,用O(n)的复杂度计算以它为左上角的最大矩形面积:
例如当前位置是[i,j],矩形高度是k(取值范围是1到高度-i),则最大面积是
max(min(f[i][j], f[i+1][j], ...) * k)
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
vector<vector<int>> f;
int r, n, m;
n = matrix.size();
m = matrix[0].size();
for (int i = 0; i < n; i++) {
vector<char>& c = matrix[i];
vector<int> a(m);
for (int j = m - 1; j >= 0; j--) {
if (j + 1 < m) r = a[j + 1]; else r = 0;
if (c[j] == '1') a[j] = r + 1; else a[j] = 0;
}
f.push_back(a);
}
int ret = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == '0') continue;
int temp = f[i][j];
if (temp > ret) ret = temp;
for (int k = i + 1; k < n; k++) {
if (matrix[k][j] == '0') break;
if (f[k][j] < temp) temp = f[k][j];
if (temp * (k - i + 1) > ret) ret = temp * (k - i + 1);
}
}
}
return ret;
}
};