柱状图中最大的矩形
题目链接: 力扣

假设以柱子1(指值为1的柱子)为基准,柱子1的左侧没有比柱子1矮的元素,所以柱子1可以无限像左边扩展,柱子1的右侧也没有比柱子1矮的元素,所以柱子1可以无限向右边扩展,
 所以柱子1的高度可以贯彻整个柱状图,即以柱子1为高度的面积为:1*6=6
以柱子5为基准,柱子5左侧没有比柱子5矮的柱子,说明柱子5左边不能进行扩展了,而柱子5右边第一个比柱子5小的柱子是柱子2,这说明柱子5能够扩展到柱子2(不包含柱子2)
以此,我们要求的就是一个柱子左边和右边第一个比其小的柱子。
所以这题和“接雨水”那道题是类似的,
 只不过 接雨水 求得是一个柱子左边和右边第一个比其大的柱子。
所以此时的单调栈是一个单调递减的单调栈了。
当当前元素大于或等于栈顶元素时,将该元素投入单调栈中
 当当前元素小于栈顶元素时,比较此时栈顶元素右边元素、栈顶元素、当前元素的大小关系。
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int result = 0;
        stack<int> Mystack;
        heights.insert(heights.begin(),0);
        heights.push_back(0);
        Mystack.push(0);
        for(int i=1; i<heights.size();i++)
        {
            if(heights[i] >=  heights[Mystack.top()])
            {
                Mystack.push(i);
            }
            else if(!Mystack.empty() && heights[i]<heights[Mystack.top()])
            {
                while(!Mystack.empty() && heights[i]<heights[Mystack.top()])
                {
                    int mid = Mystack.top();
                    Mystack.pop();
                    
                    if(Mystack.empty())
                    break;
                    
                    int h = heights[mid]; 
                    int w = i-Mystack.top()-1;
                    result=max(result,h*w);
                }
                Mystack.push(i);
            }
        }
        return result;
    }
};








![数据结构05:树与二叉树[C++][哈夫曼树HuffmanTree]](https://img-blog.csdnimg.cn/63c3e7cd38084e21b7dffcac19dbc494.png)










