暴力解法
https://leetcode-cn.com/problems/maximal-rectangle/
遍历数组,让每个点作为数组右下角元素时,然后求面积。
- 第一步,先求宽度为1时的长度len。计算此时的矩阵面积maxSize。
- 第二步,宽度加1,计算上一行的长度tlen。若tlen为0,则跳出。若非0,此时宽度为2的矩阵长度为min(len, tlen)。计算此时的矩阵面积maxSize = max(maxSize, min(len, tlen) * hei)
- 一直重复步骤二直至跳出循环
class Solution {
public:
int calSize(int x, int y, vector<vector<char>>& matrix) {
int len = 0, hei = 0;
int tx = x, ty = y;
int maxSize = 0;
while (ty >= 0) {
if (matrix[x][ty] == '1') {
len ++;
} else break;
ty --;
}
maxSize = len;
while (tx >= 0) {
ty = y;
int tlen = 0;
while (ty >= 0) {
if (matrix[tx][ty] == '1') {
tlen ++;
} else break;
ty --;
}
if (tlen <= len) {
hei ++;
len = tlen;
maxSize = max(maxSize, tlen * hei);
} else if (tlen > len) {
hei ++;
maxSize = max(maxSize, hei * len);
} else break;
tx --;
}
return maxSize;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int maxSize = 0;
for (int i = 0; i < matrix.size(); i ++) {
for (int j = 0; j < matrix[0].size(); j ++) {
if (matrix[i][j] == '1') {
maxSize = max(maxSize, calSize(i, j, matrix));
}
}
}
return maxSize;
}
};
用数组进行优化,数组每个元素记录了该点作为矩阵右下角元素的矩阵宽度。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.size() == 0) return 0;
vector<vector<int>> width(matrix.size() + 5, vector<int>(matrix[0].size() + 5, 0));
int maxSize = 0;
for (int x = 0; x < matrix.size(); x ++) {
for (int y = 0; y < matrix[0].size(); y ++) {
if (matrix[x][y] == '1') {
if (y != 0) {
width[x][y] = width[x][y - 1] + 1;
} else {
width[x][y] = 1;
}
} else {
width[x][y] = 0;
}
int minWidth = width[x][y];
int hei = 0;
for (int tx = x; tx >= 0; tx --) {
if (width[tx][y] == 0) break;
minWidth = min(minWidth, width[tx][y]);
hei ++;
maxSize = max(maxSize, hei * minWidth);
}
}
}
return maxSize;
}
};