给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
代码:
// 动态规划的思想
int MaximumRectangle(const vector<vector<char>> &matrix) {
if (matrix.empty())
return 0;
int len_x = matrix[0].size();
int len_y = matrix.size();
vector<int> height(len_x, 0);
vector<int> left(len_x, 0);
vector<int> right(len_x, len_x);
// max erea
int max_erea = 0;
for (int i = 0; i < len_y; i++) {
// if matrix[i][j] == 1 new_height[j] = old_height[j] + 1
// else new_height[j] = 0
for (int j = 0; j < len_x; j++) {
if (matrix[i][j] == '1') {
height[j] = height[j] + 1;
}
else {
height[j] = 0;
}
}
// new_left[j] = max(old_left[j], cur_left)
// cur_left是从左遍历
int cur_left = 0;
for (int j = 0; j < len_x; j++) {
if(matrix[i][j] == '1')
left[j] = max(left[j], cur_left);
else {
left[j] = 0;
cur_left = j + 1;
}
}
// new_right[j] = min(old_right[j], cur_right)
// cur_right 从右遍历
int cur_right = len_x;
for (int j = len_x - 1; j >= 0; j--) {
if(matrix[i][j] == '1')
right[j] = min(right[j], cur_right);
else {
// 这里的意思哦
right[j] = len_x;
cur_right = j;
}
}
int tmp_erea = 0;
for (int j = 0; j < len_x; j++) {
tmp_erea = (right[j] - left[j]) * height[j];
if (tmp_erea > max_erea)
max_erea = tmp_erea;
}
}
return max_erea;
}
int main(int argc, char* argv[])
{
vector<vector<char>> matrix = {
{'1', '0', '1', '1', '0', '0', '1'},
{'0', '1', '1', '1', '1', '0', '1'},
{'1', '0', '1', '1', '0', '0', '1'},
{'1', '0', '1', '0', '1', '1', '1'},
{'1', '0', '0', '1', '1', '1', '1'},
{'0', '0', '1', '1', '0', '0', '1'},
{'0', '0', '1', '0', '0', '0', '1'},
};
int max_erea = MaximumRectangle(matrix);
return 0;
}