51NOD 1102 面积最大的矩形

有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:

pic

面积最大的矩形为5,6组成的宽度为2的矩形,面积为10Input1行: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();
    }

}

猜你喜欢

转载自blog.csdn.net/Viscu/article/details/81543577