LeetCode: Largest Rectangle in Histogram

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].


The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given heights = [2,1,5,6,2,3],

return 10.

此题用穷举算出第0~i个立方体能构成的最大举行面积,根本算不上hard,但是时间限制肯定超出了限制

看网上别人思路,整理一下,以备以后忘记再看。

现在数组最后加入元素0,得到数组[2,1,5,6,2,3,0]

栈底保存数组中i前面的height[j]小于当前height[i]的下标,或者可能为空。

计算过程:

i=1时,计算0~0的最大面积,[2]

i=4时,计算2~3的包含2、3最大面积

i=6时,计算0~5的包含1、4、5最大面积

每次计算时都相当于计算一个高度为递增的树组的矩形面积


例如:处理到i=4时,此时栈中保存的下标为s{1,2,3};此时除了栈底元素1外,下标2,3都大于下标4的高度。如果再计算下标4,5,6的最大面积时,下标2,3的高度都可以不用理了,只要知道它们高度大于下标4的高度,算下标4,5,6最大面积时,只会用到下标4,5,6的高度。同时2,3高度是递增的,计算2处最大面积时用不到3高度。

(代码和思路都是别人的)代码如下:

</pre><p><pre name="code" class="cpp">class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        if(height.size() == 0) return 0;
        stack<int> st;
        int MAX = 0;
        height.push_back(0);//因为循环条件,计算最后的栈底下标到数组最后下标的面积
        int leftarea = 0, rightarea = 0;
        for(int i = 0; i < height.size(); ++i){
            while(!st.empty() && height[st.top()] > height[i]){//在栈中从顶到底找到第一个---大于height[i]的下标,或者栈底元素******重要:栈中会保存栈到底第一个小于等于height[i]的坐标(或栈为空),记住重要一句话:之前出栈的下标,它们的高度都是大于当前tmp的!!!每次计算的i前面的矩形面积,都是大于height[i]的。
                int tmp = st.top();
                st.pop();//出栈的位置的高度肯定大于height[i],以后计算最大面积时用不到此下标高度了,可以出栈不再记录了
                //从栈顶保存下标位置向左到第一个高度小于等于下标i高度之间的所有下标,计算区间【向左到第一个高度小于等于下标i高度位置,栈顶保存位置】最大矩形面积
                leftarea = (st.empty() ? tmp + 1 : tmp - st.top()) * height[tmp]; //以height[tmp]为高度,区间[st.top,tmp]矩形面积,栈空时(tmp+1)表示从0~tmp个height[tmp],因为出栈的那些都大于height[tmp]!!!
                rightarea = (i - tmp - 1) * height[tmp]; //以height[tmp]为高度,区间[tmp+1,栈顶保存位置]矩形面积
                if((leftarea + rightarea) > MAX) MAX = (leftarea + rightarea);
            }
            st.push(i);
        }
        return MAX;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值