Hard-题目27:84. 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.
题目大意:
给出一个直方图,求图中最大矩形面积。
题目分析:
首先是朴素解法,遍历所有左端点为i,右端点为j的矩形的面积。复杂度 O(n2) ,毫无疑问tle。
参考网上大神的解法,我理解如下:
维护一个递增的栈,遍历数组时,如果当前高度height[i]>stack.top则入栈,反之弹出栈直至栈顶元素 <height[i] ,然后计算出最后弹出那个边“左右延伸”所得的矩形的面积,并更新最大值,然后height[i]入栈。
注意栈中存的是下标,这样便于计算宽度=下标差。
源码:(language: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]){
                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;
    }
};

成绩:
24ms,18.83%,24ms,58.54%
cmershen的碎碎念:
以后的问题大多超越我的能力范围,解题步骤均摘抄自他人博客。

你可能感兴趣的:(Hard-题目27:84. Largest Rectangle in Histogram)