柱状图的最大矩形--单调栈

 

 

 

 

思路:从左往右遍历一遍高度值,在[ 0 , i ]范围内,求以height[ i ]为高度值能取的最大面积,不断更新这个最大面积即为最终结果

 

以某个柱子作为高度的最大面积如何求?------------------>单调递增栈

 

举个例子:给定柱子的高度分别为2   1   5   6   2   3

下标在[0,2]的范围内,以5为高的最大面积为5*1            此时维持的单调栈为( 1 )   1是比5小的第一个元素所在的下标         Area=5*(2-1)

 

更新完最大面积之后,元素5所在的下标2入栈,此时单调栈的元素为(1,2)

 

//单调栈(递增)求柱状图最大面积
int largestRectangleArea(vector<int>& heights) {
    //每个柱子的高度
    heights.push_back(0);
    //单调递增的一个栈,栈保存得是当前柱子高度所在得下标
    stack<int> stk;
    int maxArea = 0;
    for (int i = 0; i < heights.size(); i++)
    {
        //while循环维持单调栈的递增性质,
        while (!stk.empty() && heights[i] < heights[stk.top()])
        {
            int top = stk.top();
            stk.pop();
            //不断更新当前高度能取得最大值,面积=当前高度*(当前位置-第一个比当前高度小的柱子坐标)
            maxArea = max(maxArea, heights[top] * (stk.empty() ? i : (i - stk.top() - 1)));
        }
        stk.push(i);
    }
    return maxArea;
}

 

            

 

posted @ 2020-07-31 17:14  知道了呀~  阅读(283)  评论(0编辑  收藏  举报