class Solution {
public:
//单调栈
int largestRectangleArea(vector<int>& h) {
int n=h.size();
stack<int>stk; //创建一个单调栈
int res=0; //定义答案
h.push_back(-1);
// 为了算法书写方便,在数组末尾添加高度 -1
// 这会使得栈中所有数字在最后出栈。
for(int i=0;i<=n;i++)
{
while(stk.size()&&h[i]<=h[stk.top()]) {
int cur=stk.top();
stk.pop();
if(stk.empty()) //如果栈此时为空
{
res=max(res,h[cur]*i); //如果栈为空,说明宽度i,长度h[cur]
}
else
{
res=max(res,h[cur]*(i-stk.top()-1)); //如果栈非空,此时高度为h[cur],坐标cur左边第一个比其小的为stk.top(),右边第一个为i,宽度为 i-stk.top()-1. 看图像就可以看出来宽度,所以要进行-1
}
}
stk.push(i); //入栈
}
return res;
}
};
力扣 84 .柱状图中最大的矩形
最新推荐文章于 2024-07-04 10:15:20 发布