leetcode84: Largest Rectangle in Histogram

来源:互联网 发布:全国vb二级考试题库 编辑:程序博客网 时间:2024/05/17 21:44

84. Largest Rectangle in Histogram
height的内容是 [5,6,7,8,3],特点是除了最后一个,前面全部保持递增,且最后一个立柱的高度小于前面所有立柱高度。

对于这种特点的柱状图,如果使用上面所说的“挨个使用每一个柱状图的高度作为矩形的高度,求面积”的方法,还需要用嵌套循环吗?

我们知道除了最后一个,从第一个到倒数第二个立柱的高度都在升高,那么如果挨个使用每一个柱的高度作为矩形的高度,那么依次能得到的矩形的宽度就可以直接算出来:使用5作为高度可以使用前四个立柱组成 4*5的矩形,高度6可以组成3*6的矩形… 因此只需要遍历一次,选出最大面积即可。

对于这种类型的柱状图,最大矩形面积的时间复杂度是O(n)。

我们将这种特点的柱状图称为“波峰图”。

python

class Solution(object):    def largestRectangleArea(self,heights):        Stack_Numbers=[]        Stack_Index=[]        maxS=0        for i in range(len(heights)):            if not len(Stack_Numbers):                if heights[i]:                    Stack_Numbers.append(heights[i])                    Stack_Index.append(i)            else:                if heights[i]>=Stack_Numbers[-1]:                    Stack_Numbers.append(heights[i])                    Stack_Index.append(i)                else:                    if heights[i]:                        for k in range(len(Stack_Numbers)):                            if Stack_Numbers[k]>heights[i]:                                temp=Stack_Index[k]                                for h in range(len(Stack_Numbers)-k):                                    maxS=max(maxS,(i-Stack_Index[k+h])*Stack_Numbers[k+h])                                break                                   for h in range(len(Stack_Numbers)-k):                            Stack_Numbers.pop()                            Stack_Index.pop()                        if heights[i]:                            Stack_Numbers.append(heights[i])                            Stack_Index.append(temp)                    else:                        for k in range(len(Stack_Numbers)):                            maxS=max(maxS,(i-Stack_Index[k])*Stack_Numbers[k])                        for k in range(len(Stack_Numbers)):                            Stack_Numbers.pop()                            Stack_Index.pop()        if len(Stack_Numbers):            for k in range(len(Stack_Numbers)):                maxS=max(maxS,(len(heights)-Stack_Index[k])*Stack_Numbers[k])        return maxSCC=Solution()s=[3,6,5,7,4,8,1,0]print CC.largestRectangleArea(s)

C++

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]){                int tmp = st.top();                st.pop();                leftarea = (st.empty() ? tmp + 1 : tmp - st.top()) * height[tmp]; //以tmp为高度,tmp所在柱以及向左延伸出来的矩形面积                rightarea = (i - tmp - 1) * height[tmp]; //以tmp为高度,向右边延伸出来的矩形面积                if((leftarea + rightarea) > MAX) MAX = (leftarea + rightarea);            }            st.push(i);        }        return MAX;    }};
0 0
原创粉丝点击