有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 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
解法:
利用单调栈-这里是我用的单调递增
以第i的矩形的高的作为区间的最小值,我们取出0~N-1各个矩形的区间就可以了。
例如样例:
2 1 5 6 2 3
以2为最小值的,那么他的最大区间就是[0,0]
以此类推,1就是[0,6]
5就是[2,3]
6 [3,3]
2 [2,6]
3 [6,6]
然后遍历一遍就可以了。
import java.io.*;
import java.util.Stack;
/**
* @ Create by ostreamBaba on 18-8-9
* @ 描述
*/
public class _1102 {
static class Pair{
int l; //记录左区间
int r; //记录右区间
int h; //高度
int idx; //记录当前矩形的下标
}
public static void main(String[] args) throws IOException {
//BufferedReader reader=new BufferedReader(InputUtil.cin());
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in),1<<16);
PrintWriter out=new PrintWriter(System.out);
int N=Integer.parseInt(reader.readLine().split("\\s+")[0]);
Pair[] pairs=new Pair[N];
for (int i = 0; i < N; i++) {
int h=Integer.parseInt(reader.readLine());
pairs[i]=new Pair();
pairs[i].l=i;
pairs[i].h=h;
pairs[i].idx=i;
}
Stack<Pair> stack=new Stack<Pair>();
for (int i = 0; i < N; i++) {
while (!stack.empty()&&stack.peek().h>pairs[i].h){
pairs[stack.peek().idx].r=i-1;
pairs[i].l=stack.peek().l;
stack.pop();
}
stack.push(pairs[i]);
}
while (!stack.empty()){
pairs[stack.pop().idx].r=N-1;
}
long max=0;
for (int i = 0; i < N; i++) {
max=Math.max(max,(long)(pairs[i].r-pairs[i].l+1)*pairs[i].h);
}
out.print(max);
out.close();
}
}