解题思路
主要参考了讨论区置顶的解题方法。
若栈为空或height[i]大于等于栈顶元素的值,则直接将height[i]入栈。
否则,不断将比height[i]大的栈顶元素pop出来,设置一个cnt变量,作用有两个:1、记录弹出了多少个高度。2、用于计算面积,第一个弹出来的高度则矩形的宽为1,第二个弹出来的高度只能小于等于第一个高度,则高为第二个弹出值的矩形面积的宽比第一个的增加了1,刚开始想不明白,总是想万一第二个比第一个弹出来的高度高呢,其实这种情况已经不可能出现了,因为height[i]比栈顶小的时候,已经进行过这一过程,并将比height[i]大的栈顶pop出来后用height[i]重新入栈了,即前面比height[i]大的高度已经与height[i]统一了。用res记录矩形面积的最大值,并与当前栈顶元素和cnt的乘积进行比较取较大值。最后将非空矩阵清空,并与res进行比较,取最大值。
代码
#include<stack>
class Solution {
public:int largestRectangleArea(vector<int> &height) {int res = 0;stack<int>s;for(int i = 0;i < height.size();i++){if(s.empty() || s.top() <= height[i])s.push(height[i]);else{int cnt = 0;while(!s.empty() && s.top() > height[i]){cnt++;res = res > (cnt * s.top())? res : (cnt * s.top());s.pop();}while(cnt--)s.push(height[i]);s.push(height[i]);}}int t = 1;while(!s.empty()){res = res > (t * s.top()) ? res : (t * s.top());t++;s.pop();}return res;}
};