单调栈应用题
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<pair<int,int>> st;//栈中元素第一项为数组下标,第二项为元素宽度
int ans=0;
heights.push_back(-1);//尾哨兵
for(int i=0;i<heights.size();i++){
if(st.empty()||heights[i]>=heights[st.top().first]){
//维护一个单调不减的栈
st.push({i,1});//插入元素
continue;
}
int w=0;//记录宽度
while(!st.empty()&&heights[st.top().first]>heights[i]){
//弹出若干个栈顶元素,保持栈的单调性
auto [j,b]=st.top();//取栈顶元素
st.pop();
w+=b;//记录宽度
ans=max(ans,heights[j]*w);//更新答案
}
st.push({i,w+1});//插入元素
}
return ans;
}
};
时间复杂度:O(n)
空间复杂度:O(n)