单调栈C++只有0和1的矩阵中获取只有1的最大矩阵面积
时间: 2023-11-22 12:56:55 浏览: 68
单调栈是一种常用的解决包含最大/最小值的问题的数据结构,可以用于解决只有0和1的矩阵中获取只有1的最大矩阵面积问题。具体步骤如下:
1. 构建一个二维数组heights,其中heights[i][j]表示从第i行往上数有多少个连续的1。
2. 对于每一行,使用单调栈维护一个递增的序列,其中栈中存储的是当前位置之前的高度递增的矩形的位置。
3. 对于每个位置(i, j),如果heights[i][j]大于栈顶元素对应的高度,则将该位置加入栈中;否则,将栈顶元素弹出,并计算以该位置为右下角的最大矩形面积。具体计算方法为:弹出栈顶元素后,当前位置的高度即为栈顶元素弹出后的栈顶元素对应的高度,而左边界则为栈顶元素对应的位置加1,右边界为当前位置减1。计算完面积后,更新最大面积值。
4. 遍历完所有位置后,返回最大面积值即可。
下面是C++代码实现:
```C++
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
int m = matrix.size(), n = matrix[0].size();
int ans = 0;
vector<vector<int>> heights(m, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
heights[i][j] = (i == 0) ? 1 : heights[i-1][j] + 1;
}
}
}
for (int i = 0; i < m; i++) {
stack<int> s;
for (int j = 0; j <= n; j++) {
int h = (j == n) ? 0 : heights[i][j];
while (!s.empty() && h < heights[i][s.top()]) {
int height = heights[i][s.top()];
s.pop();
int width = s.empty() ? j : j - s.top() - 1;
ans = max(ans, height * width);
}
s.push(j);
}
}
return ans;
}
```
阅读全文