题意:
        给定一个数组heights,长度为n,height[i]是在第i点的高度,那么height[i]表示的直方图,能够形成的最大矩形是多少?
        1.每个直方图宽度都为1
        2.直方图都是相邻的
        3.如果不能形成矩形,返回0即可
        4.保证返回的结果不会超过 int


方法一:
中心拓展法

思路:
        二重循环。
        外层循环遍历中心点,内层循环从中心点向左右两边拓展。


class Solution {
public:
    
    int largestRectangleArea(vector<int>& heights) {
        int n=heights.size();
        int res=0;
        for(int i=0;i<n;i++){//中心拓展法
            int j=i-1,k=i+1;
            while(j>=0&&heights[j]>=heights[i]){//向左边拓展
                j--;
            }
            while(k<n&&heights[k]>=heights[i]){//向右边拓展
                k++;
            }
            res=max(res,(k-j-1)*heights[i]);//维护最大值
        }
        return res;
    }
};



时间复杂度:
空间复杂度:

方法二:
单调栈

思路:
        单调栈。
        维护一个单调递增的栈,栈存储的是值的下标(为了方便得到区间的大小)。
        当栈非空并且栈顶数>=遍历到的数时,则弹栈并计算矩形的面积。

注意:在数组的最后追加一个值为0 的数,作用是弹出栈所有的元素。



class Solution {
public:
    
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(0);//末尾追加一个0
        int n=heights.size();
        stack<int> st;//栈
        int res=0;
        for(int i=0;i<n;i++){
            while(!st.empty()&&heights[st.top()]>=heights[i]){//栈非空并且栈顶数>=遍历到的数,则弹栈并计算矩形的面积
                int t=st.top();
                st.pop();
                res=max(res,heights[t]*(st.empty()?i:i-st.top()-1));//维护最大值
            }
            st.push(i);
        }
        return res;
    }
};


时间复杂度:
空间复杂度: