LeetCode: Largest Rectangle in Histogram

来源:互联网 发布:大学生简历 知乎 编辑:程序博客网 时间:2024/05/17 02:37

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
原创粉丝点击