C++手动输入一个由0和1组成的数组,计算全为1的最大矩形的面积
时间: 2023-11-22 19:54:05 浏览: 181
C++计算矩形的面积
这是一个经典的问题,可以使用单调栈来解决。
具体思路如下:
1. 定义一个一维数组 heights,用于存储当前行中每个位置的高度,即从当前位置向上数连续的1的个数。
2. 对于每一行,将该行的 heights 数组作为输入,使用单调栈算法计算最大面积。
3. 单调栈算法的基本思路是维护一个栈,栈内元素单调递增,每当遇到一个比栈顶元素小的元素时,就将栈顶元素出栈,并计算以该元素为高度的最大面积。具体实现过程如下:
- 定义一个栈 s 和一个变量 max_area,初始值为 0。
- 遍历 heights 数组,对于每个元素 h:
- 如果栈为空或者 h 大于等于栈顶元素,则将 h 入栈。
- 否则,将栈顶元素弹出,计算以该元素为高度的最大面积,并更新 max_area。
- 重复上述操作直到栈为空或者 h 大于等于栈顶元素。
- 遍历完 heights 数组后,如果栈不为空,继续计算以栈中每个元素为高度的最大面积,并更新 max_area。
下面是完整的 C++ 实现代码:
```c++
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int largestRectangleArea(vector<int>& heights) {
stack<int> s;
int max_area = 0;
int i = 0;
while (i < heights.size()) {
if (s.empty() || heights[i] >= heights[s.top()]) {
s.push(i++);
} else {
int h = heights[s.top()];
s.pop();
int w = s.empty() ? i : i - s.top() - 1;
max_area = max(max_area, h * w);
}
}
while (!s.empty()) {
int h = heights[s.top()];
s.pop();
int w = s.empty() ? i : i - s.top() - 1;
max_area = max(max_area, h * w);
}
return max_area;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> matrix(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> matrix[i][j];
}
}
int max_area = 0;
vector<int> heights(m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == 0) {
heights[j] = 0;
} else {
heights[j]++;
}
}
max_area = max(max_area, largestRectangleArea(heights));
}
cout << max_area << endl;
return 0;
}
```
该程序首先读入矩阵的行数和列数,然后读入矩阵中每个位置的值。接下来,对于每一行,都计算出 heights 数组,并调用 largestRectangleArea 函数计算以该行为底边的最大矩形面积,并更新 max_area。最后输出 max_area 的值。
阅读全文