题目链接: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;
}
};