leetcode No84. Largest Rectangle in Histogram

Question:

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.

Algorithm:

我们用一个栈来辅助解题,这个栈是这样维护的
这个时候我们要入栈一个元素,如果高度是递增的,则入栈,如果不递增,则一直出栈直到高度是递增关系为止
Ex:215623
1、入栈2
2、待入栈元素是1,不是递增关系
(1)2出栈,那么2这个元素的Area=2*1(1的下标是1)
(2)1入栈
3、5入栈
4、6入栈
5、待入栈元素是2,不是递增关系,
(1)6出栈,那么6这个元素的Area=6*(4-2-1),4是2的下标,2是栈的顶端元素的下标;
(2)5出栈,那么5这个元素的Area=5*(4-1-1),4是2的下标,1是栈的顶端元素的下标;
(3)2入栈
6、3入栈(所有元素都入栈了)
栈中剩下的元素的面积,6为数组大小
(1)3出栈,那么3这个元素的Area=3*(6-4-1)
(2)2出栈,那么2这个元素的Area=2*(6-1-1)
(3)1出栈,那么1这个元素的Area=1*6
总结来看:
为了省去最后栈不为空的情况,我们在heights后加一个高度为0的元素,这样最后栈一定为空
栈维护的是元素的下标,而不是高度,因为我们可以直接用下标得出高度
如果当前元素小于栈的顶端元素,或栈为空,则入栈
否则,一直出栈到当前元素小于栈的顶端元素为止,出栈后计算面积
如果出栈后
(1)栈为空,设元素下标为index,则Area=heights[index]*i
(2)栈不为空,设元素下标为index,则Area=heights[index]*(i-s.top()-1)

Accepted Code:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        if(heights.empty())
            return 0;
        int maxArea=0;
        stack<int> s;
        heights.push_back(0);
        for(int i=0;i<heights.size();i++){
            if(s.empty() || heights[s.top()]<=heights[i])
                s.push(i);
            else{
                while(!s.empty() && heights[s.top()]>heights[i]){
                    int high=heights[s.top()];
                    s.pop();
                    maxArea=max(maxArea,high*(s.empty()?i:i-s.top()-1));
                }
                s.push(i);
            }
        }
        return maxArea;
    }
};


你可能感兴趣的:(LeetCode)