力扣 hot100 Day68
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> stk;int max_area = 0;int n = heights.size();heights.push_back(0);n += 1;for (int i = 0; i < n; ++i) {while (!stk.empty() && heights[i] < heights[stk.top()]) {int height = heights[stk.top()];stk.pop();int width = stk.empty() ? i : i - stk.top() - 1;max_area = max(max_area, height * width);}stk.push(i);}heights.pop_back(); return max_area;}
};
单调栈,栈内保存一个自栈底递增至栈顶的序列
每个元素都会入栈,当当前数小于栈顶值时,开始处理栈内元素,由于此时栈顶慢慢弹出递减,而宽度慢慢弹出递增,所以此时比较是有意义的。
对于一个特定高度,最大的矩形就是左右边界都比该高度更高的范围,这在该循环中都遍历到了
开始时在原序列末加入0值,防止最后有元素未处理