84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10 示例 2:
输入: heights = [2,4] 输出: 4
思路
- 如果当前条形的高度大于栈顶条形的高度,我们将它的索引压入栈中。
- 否则,我们一直从栈中弹出条形,直到栈顶的条形的高度小于当前条形的高度。每次我们弹出一个条形时,我们计算以该条形为高度的最大矩形的面积,这是因为我们知道,当前栈中的所有条形的高度都大于栈顶条形的高度。
- 面积计算为:弹出条形的高度 *(当前索引 - 弹出后的栈顶索引 - 1)。如果栈为空,则宽度为当前索引。
- 最后,我们将当前条形的索引压入栈中。
- 在遍历完成后,我们将栈中剩余的条形都弹出,并计算面积,就像在遍历过程中一样。
题解
#include <vector>
#include <stack>
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int max_area = 0;
stack<int> indices;
for (int i = 0; i <= heights.size(); ++i) {
// 我们在最后添加一个高度为0的条形,以确保所有实际的条形都被处理。
int height = (i == heights.size()) ? 0 : heights[i];
while (!indices.empty() && heights[indices.top()] > height) {
int popped_index = indices.top();
indices.pop();
int width = indices.empty() ? i : i - indices.top() - 1;
max_area = max(max_area, heights[popped_index] * width);
}
indices.push(i);
}
return max_area;
}
};