和 接雨水 十分类似,解释在注释中
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int res = 0;
heights.insert(heights.begin(), 0); // 防止整个数组都是单调增,这样就每次都会被弹出,栈会为空,不会进入计算
heights.push_back(0); // 防止整个数组都是单调减,只会被每次加入到栈里,这样就不会进入到计算中
stack<int> st;
st.push(0);
// 单调栈是单调递减的
for(int i = 1; i < heights.size(); i++)
{
if(heights[i] >= heights[st.top()])
st.push(i);
else
{
while(!st.empty() && heights[i] < heights[st.top()])
{
int mid = st.top();
st.pop();
if(!st.empty())
{
int right = i; // 右边第一个比当前值小的
int left = st.top(); // 左边第一个比当前值小的
int w = right - left - 1; // 求的是中间的宽度,所以 -1
int h = heights[mid]; // 以当前柱子为基准的高度
res = max(res , h * w); // 以当前柱子为基准的最大面积
}
}
st.push(i);
}
}
return res;
}
};