代码随想录Day64 | 84.柱状图中最大的矩形
84.柱状图中最大的矩形
文档讲解:代码随想录
视频讲解: 单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形
状态
本题和接雨水实际上是差不多的
接雨水,是考虑凹下部分heights[i]寻找左右两边第一个比heights[i]大的值,然后heights[i]的接雨水范围就是这两个大值的间距。
对于这个最大矩形面积,同样考虑heights[i],是去寻找左右两边第一个比heights[i]小的值,那么有heights[i]作为高度求得的矩形宽度就是这两个小值的间距。
所以对于接雨水我们在单调栈中使用的是从栈头到栈底递增的顺序
这道题我们应当采用从栈头到栈底递减的顺序。
当要入栈元素比栈头元素大时,直接压入,
当要入栈元素和栈头元素相等时,先弹出栈头元素,再压入
当要入栈元素比栈头元素小时,就需要计算栈头元素为高的时候的面积。
这道题还有一个注意点,就是需要在原始数组头和尾部增加0,避免由于原始数组时递增或者递减的情况下没法计算结果。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.insert(heights.begin(),0);
heights.push_back(0);
int res = 0;
stack<int> check;
check.push(0);
for(int i = 1;i<heights.size();i++)
{
if(heights[i] > heights[check.top()])
{
check.push(i);
}
else if(heights[i] == heights[check.top()])
{
check.pop();
check.push(i);
}
else
{
while(!check.empty() && heights[i] < heights[check.top()])
{
int mid = check.top();
check.pop();
int left = check.top();
int right = i;
int h = heights[mid];
int w = right-left-1;
res = max(res,h*w);
}
check.push(i);
}
}
return res;
}
};