84. 柱状图中最大的矩形

问题

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

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

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

分析

单调栈。要注意处理逻辑有两点易错:

  • 如果输入序列单调递增,那么如何处理;
  • 如果是[2,1,3],该如何处理。

代码

class Solution {
public:
    stack<pair<int, int> > stk; // val, start index
    int h_n = 0;
    int res = -1;
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(-1); // 确保递增heights时,也可以处理到栈为空。或者在下面让栈处理到空也行。
        h_n = heights.size();
        for (int i = 0; i < h_n; i++) {
            int start = i; // start记录开始的位置,例如2,1,3,值1的start显然是0,而不能是1.
            while(!stk.empty() && stk.top().first > heights[i]) {
                start = stk.top().second;
                res = max(res, (i-1-start+1)*stk.top().first);
                stk.pop();
            }
            stk.push(make_pair(heights[i], start));
        }
        return res;
    }
};
posted @ 2025-06-15 22:46  saulstavo  阅读(20)  评论(0)    收藏  举报