84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

img

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

img

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104
class Solution {
public:
   int largestRectangleArea(vector<int>& heights)
    {  
        //每个点的最大矩形是在那个点能延伸的矩形的最大值
        //就是我们需要找出每个柱子左右的第一个小于它的柱子就能计算这个柱子能延伸的矩形的最大值
        //如果暴力那么会超时,因此我们使用单调栈,让栈保持单调增,由于需要下标计算宽度,所以栈内存放下标
        //但是栈是按照柱子长度单调增。
        int ans = 0;
        vector<int> st;
        //左右放入高度为0的柱子最后就不必去计算栈不为空的情况
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        for (int i = 0; i < heights.size(); i++)
        {
            while (!st.empty() && heights[st.back()] > heights[i])//遇到栈顶的右边界,那么就出栈,同时计算栈顶的延伸矩阵最大值
            {
                int cur = st.back();//要计算的栈顶元素出栈
                st.pop_back();
                int left = st.back() + 1;//cur的左边界下标
                int right = i - 1;//cur的右边界下标
                ans = max(ans, (right - left + 1) * heights[cur]);//更新最大值
            }
            st.push_back(i);//保证每个节点入栈计算过
        }
        return ans;
    }
};
posted @ 2022-05-25 10:56  BailanZ  阅读(49)  评论(0编辑  收藏  举报