C++在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大矩形,并返回其面积。
时间: 2023-11-22 17:54:37 浏览: 121
这是一个经典的问题,可以使用栈来解决。
算法步骤如下:
1. 计算每一行中每个位置上方连续‘1’的个数,得到一个新的矩阵heights。
2. 对于heights中的每一行,使用单调栈来计算最大矩形面积。
具体实现如下:
```c++
#include <vector>
#include <stack>
using namespace std;
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.empty() || matrix[0].empty()) return 0;
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> heights(m, vector<int>(n, 0)); // 存储每个位置上方连续1的个数
for (int j = 0; j < n; ++j) {
for (int i = 0; i < m; ++i) {
if (matrix[i][j] == '1') {
heights[i][j] = (i == 0) ? 1 : heights[i-1][j] + 1;
}
}
}
int res = 0;
for (int i = 0; i < m; ++i) {
stack<int> s; // 单调栈
for (int j = 0; j <= n; ++j) {
int cur_height = (j == n) ? 0 : heights[i][j]; // 最后一个元素为0,强制计算栈内元素
while (!s.empty() && cur_height < heights[i][s.top()]) {
int h = heights[i][s.top()];
s.pop();
int w = (s.empty()) ? j : (j - s.top() - 1);
res = max(res, h * w);
}
s.push(j);
}
}
return res;
}
};
```
时间复杂度为 O(mn),空间复杂度为 O(mn)。
阅读全文