https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
思路:维护一个单调非降的栈,栈中存放的是该柱子在
h
e
i
g
h
t
s
heights
heights数组中的下标,那么当
h
e
i
g
h
t
s
[
i
]
<
h
e
i
g
h
t
s
[
s
.
t
o
p
(
)
]
heights[i]<heights[s.top()]
heights[i]<heights[s.top()],我们逐一弹出元素,并更新答案
a
n
s
=
m
a
x
(
a
n
s
,
(
i
−
s
.
t
o
p
(
)
)
∗
h
e
i
g
h
t
s
[
s
.
t
o
p
(
)
]
)
ans=max(ans,(i-s.top())*heights[s.top()])
ans=max(ans,(i−s.top())∗heights[s.top()]),这里应该很好理解,因为维护的是一个非降的栈,所以
i
−
s
.
t
o
p
(
)
i-s.top()
i−s.top()个柱子的高度都大于栈顶柱子的高度。当上述条件不满足时,我们压入最后一次弹出的栈顶的值,设为
t
m
p
tmp
tmp,并修改
h
e
i
g
h
t
s
[
t
m
p
]
=
h
e
i
g
h
t
s
[
i
]
heights[tmp]=heights[i]
heights[tmp]=heights[i],这里可能不太好理解,再次压入
t
m
p
tmp
tmp其实是表示在
i
i
i左侧的高度大于
h
e
i
g
h
t
s
[
i
]
heights[i]
heights[i]的柱子个数。我们结合下图看一下:
当处理到第 4 4 4个柱子 ( ( (下标为 3 ) 3) 3)时,在它之前的两个柱子都要弹出,为了后续能正确计算结果,需要再次压入 1 1 1,并修改 h e i g h t s [ 1 ] = h e i g h t s [ 3 ] heights[1]=heights[3 ] heights[1]=heights[3]。
为了使所有元素都能出栈,我们在 h e i g h t s heights heights后压入一个 − 1 -1 −1。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> s;
heights.push_back(-1);
int ans=0;
for(int i=0;i<heights.size();i++){
if(s.empty()||heights[i]>=heights[s.top()])
s.push(i);
else{
int tmp;
while(!s.empty()&&heights[i]<heights[s.top()]){
tmp=s.top();
ans=max(ans,(i-tmp)*heights[tmp]);
s.pop();
}
s.push(tmp);
heights[tmp]=heights[i];
}
}
return ans;
}
};