文章目录
1. 84柱状图中的最大矩形
参考文档:代码随想录
分析:
如何求矩形面积呢?
找比当前柱子左右比他更矮的柱子,从而确定柱子的宽,当前柱子的高度是长。
怎么找到左右矮的下标?
求当前左边第一个比他小,有一个比他小的元素。所以,单调栈是单调递减的,左边第一个比它小的是遍历过的,栈里,右边第一个比他大的是当前正在遍历的元素。
怎么形成单调递减的单调栈?
和栈顶相等:入栈。
大于栈顶:入栈
小于栈顶:计算
原数组的首尾为什么加0?
第一个元素左边比他更小的是边界,最后一个元素右边比他更小的边界。计算结果需要三个元素,所以加入首尾的0作为补充成第三元素,实施计算结果的逻辑。
代码:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//单调栈,但是还需要保留
//设置栈
stack<int> st;
//首位加0
heights.insert(heights.begin(), 0);
heights.push_back(0);
st.push(0);//进入单调栈的第一个下标
int answer = 0;
for(int i = 1; i < heights.size(); i++){
if(heights[i] > heights[st.top()]){
st.push(i);
}
else 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 left = st.top();//第三个元素
int right = i;
int w = right - left - 1;
int h = heights[mid];
answer = max(answer, w * h);//取面积的最大值
}
}
st.push(i);
}
}
return answer;
}
};