单调栈与矩形面积的C++实现

404 阅读1分钟

单调栈

例题:leetcode 84. 柱状图中最大的矩形 | leetcode 85. 最大矩形 | 网易笔试 [编程题]放置货物

柱状图中最大的矩形

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        // 单调栈
        // 维护一个从栈底到栈顶保持递增的单调栈
        // 扫描柱状图,若当前元素大于等于栈顶元素,则当前元素入栈
        // 否则,对单调栈进行pop()操作,直到栈顶元素不大于当前元素,当前元素入栈
        // 每一次pop操作计算一次矩形面积
        // 注意,每一次被pop的栈顶元素h,以h为高度的最大宽度为[下一个栈顶元素的下标+1,当前元素所在下标)的左闭右开空间
        int maxArea = 0;
        if (heights.size() == 0)return 0;
        heights.insert(heights.begin(), 0);  // 避免#1处underflow
        heights.push_back(0); // 使得最后st的全部非负整数元素pop()出来
        stack<int> st; // 存储heights的下标的height单调递增栈
        for (int i = 0; i < heights.size(); i++)
        {
            int cur=0;
            while (!st.empty() && heights[st.top()] > heights[i])
            {
                cur = st.top();
                st.pop();
                int curArea= heights[cur] * (i - st.top()-1); // #1
                maxArea = max(maxArea,curArea);
            }
            st.push(i);
        }
        return maxArea;
    }
};