题目来源
84. 柱状图中最大的矩形
解题思路
- 矩形的高度必为h[i]
- 不妨计算每个h[i]作为高度时矩形的面积的最大值,再取最大值即为答案
- 为此需要获取两个信息:h[i]左侧第一个小于h[i]的高度的位置l,h[i]右侧第一个小于h[i]的高度r,矩形的范围为(l,r),开区间
- 能否通过单调栈获取l和r,从左往右遍历
- 对于栈中元素,如果一碰到待比自己低的入栈元素就将自己出栈,则栈中元素第一次碰到的比自己低的入栈元素就是栈中元素的r
- 对于待入栈元素,如果栈顶元素不比自己低就将栈顶出栈,则最后栈顶元素即为待入栈元素的l,换句话说,对于栈中元素,其在栈中的前一个元素即为其l
- 由于第一个元素前面没有元素,为此,可先在栈中加入一个元素
- 最后,栈中会留下一段递增序列,这里的每个高度都还未计算,为此,可以在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;
}