LeetCode 85 最大矩形
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。
示例 2:
输入:matrix = []
输出:0
示例 3:
输入:matrix = [["0"]]
输出:0
示例 4:
输入:matrix = [["1"]]
输出:1
示例 5:
输入:matrix = [["0","0"]]
输出:0
首先要预处理前缀和,对
p
r
e
[
i
]
[
j
]
pre[i][j]
pre[i][j],表示从此位置到最左边的连续
1
1
1 的最长长度~
然后可以遍历每一个位置
i
,
j
i,j
i,j,找以此点为右下角的最大矩形面积,我们只需要从此位置往上遍历,矩形的底就是遍历过程中的最小
p
r
e
[
i
]
[
j
]
pre[i][j]
pre[i][j],而高就是遍历的行数,复杂度
O
(
m
2
n
)
O(m^2n)
O(m2n),AC代码如下:
class Solution {
public:
int maximalRectangle(vector<vector<char>> &matrix) {
int m = matrix.size();
if (m == 0) return 0;
int n = matrix[0].size();
vector<vector<int>> pre(m, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (j == 0) pre[i][j] = matrix[i][j] - '0';
else pre[i][j] = (matrix[i][j] == '0' ? -1 : pre[i][j - 1]) + 1;
}
}
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '0') continue;
int num = pre[i][j];
for (int k = i; k >= 0; k--) {
num = min(num, pre[k][j]);
ans = max(ans, num * (i - k + 1));
}
}
}
return ans;
}
};