单调栈

单调栈即栈内元素满足单调性的栈,可以线性复杂度的遍历数组得到

LeetCode 84. 柱状图中最大矩阵

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

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

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。


解析:

利用单调栈且栈内元素单调递增的特性。我们可以知道,如果当前元素入栈时且比栈顶元素大,则直接入栈,否则循环出栈栈顶元素(出栈的元素的右边界就是当前元素)直到栈中无元素或比栈顶元素大为止。

Talk is cheap. Show me the code!

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        s.push(-1);
        int res = 0;
        int size = heights.size();
        for(int i = 0; i < size; ++i){
            // 否则....
            while(s.top() != -1 && heights[i] < heights[s.top()]){
                int h = heights[s.top()];
                s.pop();
                res = max(res, h * (i - s.top() - 1));
            }
            s.push(i);
        }
        // 这步别漏了,栈内还有元素
        while(s.top() != -1){
            int h = heights[s.top()];
            s.pop();
            res = max(res, h * (size - s.top() - 1));
            
        }
        return res;
    }
};

理解后可以试着解决本题目的延伸题目:

85. 最大矩形

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容