地址:https://leetcode.com/problems/maximal-rectangle/
题目:
Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.
Example:

理解:
找出给定的矩阵里全1的矩形的最大区域。
实现1:
参考:Share my DP solution
采用dp的思想进行扫描。对于每行
- 如果某个位置为0,则重置矩形高度;否则,高度为上一行的高度+1
- 从左到右,保存当前连续1的起始位置,当前位置的连1起始位置为上一行的连1的起始位置和本行目前连1起始位置的较大值;
- 从右到左,保存当前连续1的终止位置+1。当前位置的终止位置,为本行和上一行的终止位置中的较小值。
- 从左到右计算目前行的最大面积。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
const int m = matrix.size();
const int n = matrix[0].size();
vector<int> left(n, 0), right(n, n), height(n, 0);
int maxArea = 0;
for (int i = 0; i < m; i++) {
int curr_left = 0, curr_right = n;
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == '1')
height[j]++;
else
height[j] = 0;
}
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
left[j] = max(left[j], curr_left);
}
else {
left[j] = 0;
curr_left = j + 1;
}
}
for (int j = n - 1; j >= 0; j--) {
if (matrix[i][j] == '1') {
right[j] = min(right[j], curr_right);
}
else {
right[j] = n;
curr_right = j;
}
}
for (int j = 0; j < n; j++)
maxArea = max(maxArea, (right[j] - left[j])*height[j]);
}
return maxArea;
}
};
实现2:
利用84. Largest Rectangle in Histogram题的方法作为辅助。扫描每行,并生成柱状图。其中如果本行为1,柱状图的高度就是上一行的高度加1,否则就是0。
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+1, 0);
int maxArea = 0;
for (int i = 0; i < m; ++i) {
stack<int> stk;
for (int j = 0; j <= n; ++j) {
if (j < n&&matrix[i][j] == '1')
h[j]++;
else
h[j] = 0;
if (stk.empty() || h[stk.top()] <= h[j])
stk.push(j);
else {
while (!stk.empty() && h[stk.top()] > h[j]) {
int heightIndex = stk.top();
stk.pop();
int r = j - 1;
int l = stk.empty() ? 0 : stk.top() + 1;
int width = r - l + 1;
maxArea = max(maxArea, h[heightIndex] * width);
}
stk.push(j);
}
}
}
return maxArea;
}
};
本文详细解析了LeetCode上的“最大矩形”问题,提供了两种高效的算法实现方案。第一种采用动态规划思想,通过记录矩形的高度、左右边界来求解最大面积。第二种借鉴“直方图中最大矩形”的思路,逐行构建直方图并计算最大面积。两方案均附带完整代码,便于理解和实践。
&spm=1001.2101.3001.5002&articleId=85602738&d=1&t=3&u=8ba9c0f8d4dd46499fd10114abe290b3)
968

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



