leetcode: Largest Rectangle in Histogram

本文介绍了一种在O(N)时间内求解直方图中最大矩形面积的有效算法。通过寻找“下降节点”来限定矩形的高度,并使用栈来跟踪高度和索引,从而高效地计算出最大面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很棒的一道题,比较好的解决办法是扫描一遍再O(N)的时间消耗内。   看了很多人的解答,感觉关键还是找到下降节点。  我们令最右侧的右边高度为0,那么整个数组肯定能够找到下降节点。   下降节点限制了其左侧比该节点高的所有立方柱的高度为该节点高度。   我们只需在找到每个下降节点时统计其左侧所有比其高的立方柱构成的矩形的最大面积,之后就可以把这些立方柱的高度看作下降节点的高度。  这样在之后的计算中就无需考虑这些立方柱了。     之后回顾时要好好再看看代码。


public class Solution {
    public int largestRectangleArea(int[] height) {
        int len = height.length;
        if( len==0 )
        {
            return 0;
        }
        Stack<Integer> l=new Stack<Integer>();
        Stack<Integer> h=new Stack<Integer>();
        l.push(0);h.push(height[0]);
        int res=0;
        for( int i=1;i<=len;i++ )
        {
            int top = h.peek();
            int cur_h;
            if( i==len )
            {
                cur_h = 0;
            }
            else
            {
                cur_h = height[i];
            }
            if( top<=cur_h )
            {
                l.push(i);
                h.push(cur_h);
            }
            else
            {
                int index = l.peek();
                while(top>=cur_h)
                {
                    index = l.peek();
                    int area=top*(i-index);
                    if( area>res )
                    {
                        res = area;
                    }
                    l.pop();
                    h.pop();
                    if( l.empty() )
                    {
                        break;
                    }
                    top = h.peek();
                }
                l.push(index);
                h.push(cur_h);
            }
        }
        return res;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值