有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:
面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
Input
第1行:1个数N,表示数组的长度(0 <= N <= 50000)
第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
Output
输出最大的矩形面积
Input示例
6
2
1
5
6
2
3
Output示例
10
思路:
利用单调递增栈,当输入比栈顶值小时,遍历栈内的值,栈顶的值能影响的范围为它的位置到当前输入的位置相减。遍历完后,需要将当前输入值放到最左边那个大于它的值之前的位置。
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
typedef long long ll;
ll input[50001];
int main(int argc, const char * argv[])
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> input[i];
}
input[n] = -1;
stack<int> buf;
int last = 0;
ll result = 0;
buf.push(0);
for (int i = 1; i <= n; i++)
{
if (input[i] > input[buf.top()])
{
buf.push(i);
}
else if (input[i] < input[buf.top()])
{
while (!buf.empty() && input[i] < input[buf.top()])
{
ll temp = (i - buf.top()) * input[buf.top()];
if (temp > result)
{
result = temp;
}
last = buf.top();
buf.pop();
}
buf.push(last);
input[last] = input[i];
}
}
cout << result << endl;
return 0;
}