题目描述:给二维0/1矩阵,找到其中只包含1的,且最多的子矩阵,返回其大小。如:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 6.
分析:这道题被标记为动态规划,如果是一维的就可以设计数器直接记录后刷新max,二维的就要记录包含1的矩形区域的大小。设置数组记录当前行的每一列中1出现的最右侧的左边界,R[n]记录当前行的每一列中1出现的最左侧的右边界,则R[n]-L[n]就是本行最多的连续1所在的矩形的长,H[n]记录本列可构成最大矩形的高。时间复杂度O(n^2),空间O(1)。
代码:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
int m = matrix.size();
int n = matrix[0].size();
vector<int> h(n, 0);
vector<int> l(n, 0);
vector<int> r(n, n);
int ret = 0;
for (int i = 0; i < m; i ++)
{
int left = 0, right = n;
for (int j = 0; j < n; j ++)
{
if (matrix[i][j] == '1')
{
h[j] ++;
l[j] = max(l[j], left);
}
else
{
left = j + 1;
h[j] = 0;
l[j] = 0;
r[j] = n;
}
}
for (int j = n - 1; j >= 0; j --)
{
if (matrix[i][j] == '1')
{
r[j] = min(r[j], right);
ret = max(ret, h[j] *(r[j] - l[j]));
}
else
right = j;
}
}
return ret;
}
};