代码随想录算法训练营第六十天| 84.柱状图中最大的矩形

柱状图中最大的矩形

题目链接: 力扣 

假设以柱子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;


    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值