let 84 Maxmuim Rectange in Historgram

这是一篇关于动态规划和栈的应用问题,主要解决的是在柱状图中找到最大矩形的面积。通常此类最值问题是动态规划的经典题目,但此题采用栈的思想来优化,通过维护一个单调非递减栈来跟踪可能的最大面积,当遇到下降的柱子时,可能存在最大矩形,更新答案。特殊情况是,栈底元素左侧的柱子高度都小于它,因此宽度可能是当前索引i,而右侧宽度为i - 栈顶元素索引 - 1。

主题思想: 这是一道求最值问题,一般这种问题,是动态规划问题,一种最容易想到的方法是,用一根线扫描,这样有多少个高度就需要多少根线,没扫描一次,O(n) 总的就是 n^2

这里利用栈的思想: 如果一个条状,他后面的条高度比他高,那么这个条状肯定不是最大面积的终止条,因为扩展到后面的条面积就增加了,所以,只有出现下降条时,才可能出现最大值。 所以用栈维护一个单调非递减数值,记录下标,遇见当前条比栈顶小,就出栈,统计可能出现的最大值,
这里有个特殊情况,对于栈中最底层的元素,在栈底下标之前的条,都比他大,所以应该长应该是i ,其余的应该是i- stack.peekFirst()-1.

AC 代码:

 public int getMaxHistorgram(int [] heights){

        if(heights==null)  return 0;
        int n=heights.length;

        // need add a end flag so ,i can be equal to n
        int tmp=0;
        int mx=0;

        Deque<Integer> stack=new ArrayDeque<Integer>();
        for(int i=0;i<=n;i++){
            tmp=(i==n?0:heights[i]);
            if(stack.isEmpty()||tmp>=heights[stack.peekFirst()]){
                stack.push(i);
            }else{

                tmp=stack.pop();
                mx=Math.max(mx,heights[tmp]*(stack.isEmpty()?i:i-stack.peekFirst()-1));
                i--; //important
            }
        }
        return mx;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值