题目:

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.
clipboard.png
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].
clipboard.png
The largest rectangle is shown in the shaded area, which has area = 10 unit.

样例:

给出 height = [2,1,5,6,2,3],返回 10

思路:
用一个栈来保存下标,遇到比栈中下标对应的值大的高度时,就将这个这个高度的下标压入栈中,即保证栈中下标对应的高度是非降型的;
遇到比栈中下标对应值小的高度,栈顶元素将会被弹出,计算此时的面积,和res比较,取较大值。这里矩形的高就是弹出的矩形高度,若栈非空,矩形的宽为弹出的元素个数,若栈为空,矩形的宽为目前最大长度i;
为了保证到最后时依旧存在一个不升状态,即结束状态,要在height中压入一个0。

参考答案:

class Solution {
public:
    /*
     * @param height: A list of integer
     * @return: The area of largest rectangle in the histogram
     */
    int largestRectangleArea(vector<int> &height) {
        // write your code here
        int res = 0;
        stack<int> s;
        height.push_back(0);//保证最小,为的是维护栈到最后
        
        for(int i=0; i<height.size(); i++){//height[i]是这样的状态:它并未入栈只是做比较
            if(s.empty() || height[s.top()]<=height[i]){
                s.push(i);
            }
            else{
                int temp = s.top();
                s.pop();
                res = max(res, height[temp]*(s.empty()?(i-1+1):(i-(s.top()+1))));//这句话要好好理解
                //由于栈中维护的是一个升序序列,所以最后弹出的那个一定是最小的
                i--;//这里保证之前比heght[i]大的都要弹出去
            }
        }
        return res;
    }
};

wydong
40 声望5 粉丝

wyd