思路:
感觉像单调栈,但是就是想不出怎么用这个单调栈。看题解了。。。
这题考的基础模型其实就是:在一维数组中对每一个数找到第一个(离自己最近的)比自己小的元素。这类“在一维数组中找第一个满足某种条件的数”的场景就是典型的单调栈应用场景。
有了这个东西,我们就可以O(n)的时间,遍历每一个高度,然后可以知道以该高度能扩展的最大面积是多少,最后取一个max就可以了。
再次重温单调栈!
这里注意开两个数组存一下每个高度的柱子左边第一个小于自己的下标,和右边第一个小于自己的下标。
代码:
const int N = 1e5+10;
static const auto io_sync_off = []() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
return 0;
}();
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int near_left[N];
int near_right[N];
int st[N];//栈里存下标便于后续求距离
int hh=0;
st[0]=-1;
int n=heights.size();
for(int i=0;i<n;i++)
{
while(hh!=0&&heights[st[hh]]>=heights[i])
{
hh--;
}
near_left[i]=st[hh];//记录每个柱子 左边离自己最近的比自己小的下标
st[++hh]=i;
}
hh=0;
st[hh]=n;
for(int i=n-1;i>=0;i--)
{
while(hh!=0&&heights[st[hh]]>=heights[i])
{
hh--;
}
near_right[i]=st[hh];//记录每个柱子 右边离自己最近的比自己小的下标
st[++hh]=i;
}
int max_area=0;
for(int i=0;i<n;i++)
{
max_area=max(max_area,(near_right[i]-near_left[i]-1)*heights[i]);
}
return max_area;
}
};