題目鏈接:click~
/*題意:N個非負整數,分別代表寬爲1的柱子,從圖中找出最大矩形的面積*/
/**
*思路: 觀察發現,只有較矮的柱子才能和其它柱子構成矩形。比較相鄰的兩個
* 柱子:
* 1)如果後面的柱子比前面的矮,如1比2矮,那麼2在以後的計算中已經
* 沒什麼用,這時候計算2和之前的柱子組成的最大矩形。
* 2)如果後面的柱子比前面的高,如1和5,這兩根柱子可以和後面的柱子組成矩形
*
* 用一個棧記錄上升的柱子(柱子的位置可能是不連續的),如果遇到下降的柱子,
* 開始計算棧頂和之前柱子構成的矩形面積。棧保存的是柱子的下標,而不是柱子
* 的高度。目的是方便計算矩形的寬度。遇到上升的柱子,壓入棧中
*/
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
int len = height.size(), maxx = 0;
stack<int> s;
s.push(-1);//方便計算相對距離
for(int i = 0; i < len; i ++) {
int pre = s.top();
if(pre < 0 || height[i] >= height[pre])//上升的柱子,壓入棧中
s.push(i);
else {
s.pop();
maxx = max(maxx, height[pre]*(i-s.top()-1));
i--;//不確定當前元素是否在上升序列中
}
}
//棧中還有元素,表明柱子到結尾都是上升的
while(s.top() != -1) {
int pre = s.top();
s.pop();
maxx = max(maxx, height[pre]*(len-s.top()-1));
}
return maxx;
}
};