84. 柱状图中最大的矩形

25 阅读1分钟

题目来源

84. 柱状图中最大的矩形

解题思路

  1. 矩形的高度必为h[i]
  2. 不妨计算每个h[i]作为高度时矩形的面积的最大值,再取最大值即为答案
  3. 为此需要获取两个信息:h[i]左侧第一个小于h[i]的高度的位置l,h[i]右侧第一个小于h[i]的高度r,矩形的范围为(l,r),开区间
  4. 能否通过单调栈获取l和r,从左往右遍历
  5. 对于栈中元素,如果一碰到待比自己低的入栈元素就将自己出栈,则栈中元素第一次碰到的比自己低的入栈元素就是栈中元素的r
  6. 对于待入栈元素,如果栈顶元素不比自己低就将栈顶出栈,则最后栈顶元素即为待入栈元素的l,换句话说,对于栈中元素,其在栈中的前一个元素即为其l
  7. 由于第一个元素前面没有元素,为此,可先在栈中加入一个元素
  8. 最后,栈中会留下一段递增序列,这里的每个高度都还未计算,为此,可以在h后面新增一个最低的元素,以便将这些元素出栈

代码实现

int largestRectangleArea(vector<int> &heights) {
    vector<int> &h = heights;
    int res = 0;
    stack<int> sk;
    h.push_back(-1), sk.push(-1);
    for (int r = 0, l, k; r < h.size(); r++) {
        while (sk.size() > 1 && h[sk.top()] >= h[r]) {
            k = sk.top(), sk.pop(), l = sk.top();
            res = max(res, h[k] * (r - l - 1));
        }
        sk.push(r);
    }
    return res;
}