https://leetcode.com/problems/maximal-rectangle/description/
看到这题我第一反应就是最大子矩阵和,然后很快就能得到O(n^3)的算法
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.size() == 0) return 0;
int sum[matrix.size()][matrix[0].size()];
// memset(sum, 0, sizeof(sum));
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
sum[i][j] = matrix[i][j] == '1' ? 1 : 0;
if (i != 0) {
sum[i][j] += sum[i-1][j]; //第j列的前i个数的和
}
}
}
int ans = 0;
for (int i = 0; i < matrix.size(); i++) {
for (int j = i; j < matrix.size(); j++) { //从i行到j行
int subSum = 0;
for (int k = 0; k < matrix[i].size(); k++) { //枚举每一个可能列
int colsum = 0;
if (i == 0) {
colsum = sum[j][k];
} else {
colsum = sum[j][k] - sum[i-1][k];
}
if (colsum == j - (i - 1) ) {
subSum += colsum;
ans = max(ans, subSum);
} else {
ans = max(ans, subSum);
subSum = 0;
}
}
}
}
return ans;
}
};看了discuss发现一个O(n^2)的,这里来补充解释一下
https://leetcode.com/problems/maximal-rectangle/discuss/29054/
这个链接的解释,难理解的点,就是left和right,此处补充解释一下
0 0 0 1 0 0 0
0 0 1 1 1 0 0
0 1 1 1 1 1 0
The vector “left” and “right” from row 0 to row 2 are as follows
row 0:
l: 0 0 0 3 0 0 0
r: 7 7 7 4 7 7 7
row 1:
l: 0 0 2 3 2 0 0
r: 7 7 5 4 5 7 7
row 2:
l: 0 1 2 3 2 1 0
r: 7 6 5 4 5 6 7
比如上面的例子,(i,j)=(1,3)为例子解释,left = 2 right = 5,也就是从第2列到第5列(不包含5)的height都是大于等于height[2]的,维护了这样的数组就方便求面积了
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.size() == 0) return 0;
int sum[matrix.size()][matrix[0].size()];
// memset(sum, 0, sizeof(sum));
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
sum[i][j] = matrix[i][j] == '1' ? 1 : 0;
if (i != 0) {
sum[i][j] += sum[i-1][j]; //第j列的前i个数的和
}
}
}
int ans = 0;
for (int i = 0; i < matrix.size(); i++) {
for (int j = i; j < matrix.size(); j++) { //从i行到j行
int subSum = 0;
for (int k = 0; k < matrix[i].size(); k++) { //枚举每一个可能列
int colsum = 0;
if (i == 0) {
colsum = sum[j][k];
} else {
colsum = sum[j][k] - sum[i-1][k];
}
if (colsum == j - (i - 1) ) {
subSum += colsum;
ans = max(ans, subSum);
} else {
ans = max(ans, subSum);
subSum = 0;
}
}
}
}
return ans;
}
};
本文介绍了 LeetCode 上的最大矩形问题,并提供了一种高效的 O(n^2) 解决方案。通过对矩阵中每个元素的高度进行预处理,利用辅助数组 left 和 right 来记录当前高度下连续的1的左右边界,以此快速求得最大矩形面积。

697

被折叠的 条评论
为什么被折叠?



