C++单调栈手动输入一个由0和1组成的数组,计算全为1的最大矩形的面积
时间: 2023-07-16 21:17:12 浏览: 48
以下是C++代码实现:
```cpp
#include <iostream>
#include <stack>
using namespace std;
int getMaxArea(int arr[], int n)
{
// 创建一个空栈
stack<int> s;
int maxArea = 0, area = 0, i = 0;
while (i < n) {
// 如果栈为空或当前元素大于等于栈顶元素,则将当前元素的下标入栈
if (s.empty() || arr[i] >= arr[s.top()]) {
s.push(i);
i++;
}
else {
// 否则,弹出栈顶元素,计算以该元素为高度的最大矩形面积
int top = s.top();
s.pop();
// 如果栈为空,则该元素左侧没有比它更小的元素,面积为当前元素值乘以当前位置下标
if (s.empty()) {
area = arr[top] * i;
}
// 否则,当前元素左侧第一个比它小的元素为栈顶元素的下一个元素
else {
area = arr[top] * (i - s.top() - 1);
}
// 更新最大面积
if (area > maxArea) {
maxArea = area;
}
}
}
// 处理剩余元素,和上述过程类似
while (!s.empty()) {
int top = s.top();
s.pop();
if (s.empty()) {
area = arr[top] * i;
}
else {
area = arr[top] * (i - s.top() - 1);
}
if (area > maxArea) {
maxArea = area;
}
}
return maxArea;
}
int main()
{
int n;
cout << "请输入数组长度:";
cin >> n;
int arr[n];
cout << "请输入数组元素(0或1):" << endl;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int maxArea = getMaxArea(arr, n);
cout << "全为1的最大矩形面积为:" << maxArea << endl;
return 0;
}
```
这里使用了一个单调递增栈,栈中存储的是元素的下标。遍历数组时,如果栈为空或当前元素大于等于栈顶元素,则将当前元素的下标入栈;否则,弹出栈顶元素,计算以该元素为高度的最大矩形面积,并更新最大面积。最后处理剩余元素,和上述过程类似。时间复杂度为 O(n)。