【C++编程能力提升】

代码随想录训练营Day63 | Leetcode 84

一、84 柱状图中最大的矩形

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

核心:利用递减栈求解最大矩形的面积,只有从栈顶到栈底保持递减才使得栈顶元素的最大值,那么当前遍历元素小于栈顶元素时就需要计算此时的矩形面积(不太理解?)

    int largestRectangleArea(vector<int>& heights) {
    //当前元素大于栈顶元素直接入栈,当前元素小于栈顶元素时与栈顶元素和栈顶下一个元素构成了矩形
    int res=0; //记录矩形的最大面积
    stack<int> stk; //递减栈,从栈顶到栈底递减
    heights.insert(heights.begin(),0); //数组开头插入元素0
    heights.push_back(0);  //数组末尾插入元素0

    stk.push(0);  //第一个元素下标入栈
    for(int i=1;i<heights.size();++i)
    {
        if(heights[i]>heights[stk.top()])
            stk.push(i); //当前元素大于栈顶元素,则入栈
        else if(heights[i]==heights[stk.top()])
        {//更新栈顶元素,即先弹出栈顶元素再将当前元素下标入栈
            stk.pop();
            stk.push(i);
        }
        else
        {
            while(!stk.empty() && heights[i]<heights[stk.top()])
            {//栈顶元素最大,其左边和右边(当前遍历元素)都是小于栈顶元素的值
                int mid=stk.top(); //此时栈顶元素下标值
                stk.pop(); 
                if(!stk.empty())
                {
                    int left=stk.top();
                    int right=i;
                    int w=right-left-1; //左右边界宽度-1
                    int h=heights[mid];//最大元素值
                    res=max(res,w*h);
                }
            }
            stk.push(i);
        }
    }
    return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值