直方图最大面积
时间限制:1 sec
空间限制:256 MB
问题描述
有一个直方图,横轴长度为 n,第 i 列的高度为 h[i]。
请你求出在这个直方图中面积最大的子矩阵。
输入格式
第一行一个正整数 n。
第二行 n 个用空格隔开的非负整数,依次描述 h[1],h[2],…,h[n]。
输出格式
输出一行一个数,表示最大面积。
样例输入
5
2 3 3 3 2
样例输出
10
数据范围
对于 30% 的测试点,保证 n<=4。
对于 70% 的测试点,保证 n<=1000。
对于所有测试点,保证 n<=50000。
保证所有 h[i] 不超过 32767。
#include <iostream>
#include <stack>
#include <stdlib.h>
using namespace std;
// n:意义如题
// height:高度数组,height[i]表示第i列的高度(下标从1开始),数组大小为n+2,其中height[0]和height[n+1]都为0
// 返回值:题目所求答案,即最大面积
int getAnswer(int n, int *height) {
int ans = 0;
stack< int > myStack;
/* push(0) 是为了能把第一个元素入栈 */
myStack.push(0);
/* 从N+1开始是为了把最后一个元素和第一个元素也弹出来 */
for(int i = 1; i <= n+1; ++i){
while ((height[myStack.top()] > height[i])) {
int nowHeight = height[myStack.top()];
myStack.pop();
ans = max(ans, nowHeight * (i - myStack.top() - 1));
/* 其实蛮不容易的QAQ,我这一句一直写错,后来重新看了一遍视频才写出来- - */
}
myStack.push(i);
}
return ans;
/* 请在这里设计你的算法,并将答案返回 */
}
int main() {
int n;
cin >> n;
int* height = new int[n + 2]();
for(int i = 0; i < n+2; i++) /*初始化,虽然不太有必要*/
height[i] = 0;
for (int i = 1; i <= n; ++i)
cin >> height[i];
cout << getAnswer(n, height) << endl;
delete[] height;
return 0;
}