🧩Algo

84. 柱状图中最大的矩形

难度:🔴 Hard | 标签:单调栈 | 状态:⬜ LeetCode 链接

思路

对每根柱子求「以它为高」能扩展的最大矩形 = 左右第一个更矮位置围出来的宽度 × 高。 单调递增栈:栈顶比当前矮的全弹出,弹出时计算面积。

两端加 0 哨兵简化边界。

代码

class Solution {
public:
    int largestRectangleArea(vector<int>& h) {
        vector<int> a = {0};
        a.insert(a.end(), h.begin(), h.end());
        a.push_back(0);
        stack<int> st;
        int best = 0;
        for (int i = 0; i < (int)a.size(); ++i) {
            while (!st.empty() && a[i] < a[st.top()]) {
                int j = st.top(); st.pop();
                int w = i - st.top() - 1;
                best = max(best, a[j] * w);
            }
            st.push(i);
        }
        return best;
    }
};

复杂度

  • 时间 O(n),空间 O(n)

易错 / 回顾

  • 两端 0 哨兵让左右边界自然清空
  • 宽度 = i - 新栈顶 - 1(弹出 j 后的新栈顶就是 j 左边的较矮元素)
  • 与「最大矩形」(85)联动:每行视为柱状图
Related · 栈