84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

思路:

感觉像单调栈,但是就是想不出怎么用这个单调栈。看题解了。。。

这题考的基础模型其实就是:在一维数组中对每一个数找到第一个(离自己最近的)比自己小的元素。这类“在一维数组中找第一个满足某种条件的数”的场景就是典型的单调栈应用场景。

        有了这个东西,我们就可以O(n)的时间,遍历每一个高度,然后可以知道以该高度能扩展的最大面积是多少,最后取一个max就可以了。

再次重温单调栈!

这里注意开两个数组存一下每个高度的柱子左边第一个小于自己的下标,和右边第一个小于自己的下标。

代码:

const int N = 1e5+10;
static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
    
    return 0;
}();

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int near_left[N];
        int near_right[N];
        int st[N];//栈里存下标便于后续求距离
        int hh=0;
        st[0]=-1;
        int n=heights.size();
        for(int i=0;i<n;i++)
        {
            while(hh!=0&&heights[st[hh]]>=heights[i])
            {
                hh--;
            }
            near_left[i]=st[hh];//记录每个柱子 左边离自己最近的比自己小的下标
            st[++hh]=i;
        }
        hh=0;
        st[hh]=n;
        for(int i=n-1;i>=0;i--)
        {
            while(hh!=0&&heights[st[hh]]>=heights[i])
            {
                hh--;
            }
            near_right[i]=st[hh];//记录每个柱子 右边离自己最近的比自己小的下标
            st[++hh]=i;
        }
        int max_area=0;
        for(int i=0;i<n;i++)
        {
            max_area=max(max_area,(near_right[i]-near_left[i]-1)*heights[i]);
        }
        return max_area;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值