Day60 | 84.柱状图中最大的矩形
柱状图中最大的矩形
LeetCode题目:https://leetcode.cn/problems/largest-rectangle-in-histogram/
本题与接雨水相似,但有所不同。如果在该题中维护一个从栈顶到栈底单调递增的单调栈,那么计算的面积都会被最小的高度值所限制,需要各种的判定不说,计算结果也存在问题!
因此,为了避免被最小的高度值所限制,维护一个从栈顶到栈底单调递减的单调栈比较好。此时,当遇到比栈顶元素要小的当前元素值的时候,就可以从当前栈顶元素作为高度,栈顶元素的下标和当前元素值的下标求差值,即是矩形的宽度。
此处要注意一个细节,即宽度的计算(i - left - 1),可能会疑问为什么不能直接(i - mid)呢?这是因为的单调栈的元素不一定是连续的。
此外,对height数组首尾分别添加0的作用
末尾加0:如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。
首部加0:数组本身是降序的,那么第一个元素会因为代码逻辑的问题,提取后栈为空值,无法进行计算。但可能该部分为最大值。
代码如下:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
stack<int> recStack;
heights.insert(heights.begin(), 0);
heights.push_back(0);
recStack.push(0);
for (int i = 1; i < heights.size(); i++) {
if (heights[i] >= heights[recStack.top()]) {
recStack.push(i);
}else {
while (!recStack.empty() && heights[i] < heights[recStack.top()]) {
int mid = recStack.top();
recStack.pop();
if (!recStack.empty()) {
int left = recStack.top();
result = max(result, (i - left - 1) * heights[mid]);
}
}
recStack.push(i);
}
}
return result;
}
};