单调栈——84. 柱状图中最大的矩形(上)

183 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

题目描述

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

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

示例1 image.png

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

思路分析

在结合上一道题单调栈——739每日温度的前提下,我们可以想象为这道题的目前是算出【某天后要经过几天才能遇到更低温度 * 该天温度】的最大值。听起来有点绕口,实际上能帮助我们看到两道题的共性,我们仍然可以仿照每日温度将【某天后要经过几天才能遇到更低温度 * 该天温度】的值存在一个数组中,并在最后获取最大值(当然我们也可以将其存在一个int max中,但这是灵活的事,而不是共性的事)。

目前的共性是,似乎单调栈与某idx距符合条件M的idx1idx_1的最近距离。

具体实现

int largestRectangleArea(vector<int>& heights) {
        stack<int> stk;
        int maxRet = 0;
        for (int i = 0; i < heights.size(); i ++){
            while(!stk.empty() && heights[stk.top()] > heights[i]) {
                int tmp = stk.top(); stk.pop();
                maxRet = max((i -  tmp) * heights[tmp], maxRet);
            }
        stk.push(i);
        }    
        if(!stk.empty()){
            int s = stk.top() + 1;
            while(!stk.empty()){
                int tmp = stk.top(); stk.pop();
                maxRet = max((s -  tmp) * heights[tmp], maxRet);
            }  
        }
         
        return maxRet;
    }

总结

自信提交的第一次并没有判空的部分,第二次补上之后发现还是没有通过。

截屏2022-01-18 下午1.40.33.png

仔细检查后发现没有计算前面的部分,因此需要双向计算。获得左右两个边界,再计算矩形面积。而且由于使用的maxRet而不是数组,导致最后还需要处理一遍栈中的值。