https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
思路:維護一個單調非降的棧,棧中存放的是該柱子在數組中的下標,那麼當,我們逐一彈出元素,並更新答案,這裏應該很好理解,因爲維護的是一個非降的棧,所以個柱子的高度都大於棧頂柱子的高度。當上述條件不滿足時,我們壓入最後一次彈出的棧頂的值,設爲,並修改,這裏可能不太好理解,再次壓入其實是表示在左側的高度大於的柱子個數。我們結合下圖看一下:
當處理到第個柱子下標爲時,在它之前的兩個柱子都要彈出,爲了後續能正確計算結果,需要再次壓入,並修改。
爲了使所有元素都能出棧,我們在後壓入一個。
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;
}
};