直方图内最大矩形

来源:互联网 发布:无法连接windows系统 编辑:程序博客网 时间:2024/06/04 18:51

问题描述:
有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。
给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
测试样例:
[2,7,9,4,1],5
返回:14

分析:这里我们维护一个堆栈,当栈顶中的元素大于当前元素时,那么可能包含栈顶元素的(最后结果)的高度实际上是由当前元素限制死了。所以弹栈。当然了,在弹栈过程中,还需要计算弹出栈的面积。因为栈中维护的是一个递增的元素,所以弹栈之后,再弹栈时,右边界实际上变成了最开始弹栈的右边界。

代码如下:

import java.util.*;public class MaxInnerRec {    class Node{        int left;        int right;        int val;        Node(int left,int right,int val){            this.left = left;            this.right = right;            this.val = val;        }    }    public int countArea(int[] A, int n) {        // write code here        if(n<=0)            return 0;        int max = 0;        Stack<Node> stack = new Stack<>();        stack.push(new Node(0,1,A[0]));        for(int i = 1;i<n;i++){            Node top = stack.peek();            int rightEdge = -1;            int leftEdge = i;            while(top.val>A[i]){//弹出节点                stack.pop();                if(rightEdge == -1)                    rightEdge = top.right;                leftEdge = top.left;                int area = (rightEdge-leftEdge)*top.val;                if(area>max)                    max = area;                if(stack.isEmpty())                    break;                top = stack.peek();            }            stack.push(new Node(leftEdge,i+1,A[i]));        }        int rightEdge = -1;        while(!stack.isEmpty()){            Node top = stack.pop();            if(rightEdge == -1)                rightEdge = top.right;            int area = (rightEdge-top.left)*top.val;            if(area>max)                max = area;        }        return max;    }}
0 0
原创粉丝点击