这道题是看了题解的思路才会的

我捋一遍,这道题我们要达到的目的是以每一个heights里的element为海拔,所能划到的最多的面积area

考虑用一个stack解决问题,保持stack里的element是非降序的,这样便可以把上面我们的目标转化为以每一个heights里的element为起点,置末端所能划到的最多的area
实现这个方法很简单,遍历heights,push stack当stack为empty或top小于element,这很容易理解,而当element小于top时,pop stack,直到stack为empty或者top小于element,Cnt计数弹出次数,并计算弹出的值与Cnt的乘积在area里取最大值,最后每弹出一个,便插入一个height[i]

class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int>s;
heights.push_back(0);
int i = 0;
int area = 0;
while (i<heights.size()) {
if (s.empty() || heights[i] > s.top())s.push(heights[i]);
else {
int Cnt = 0;
while (!s.empty()&&heights[i] < s.top()) {
++Cnt;
int temp = s.top();
s.pop();
if (temp*Cnt > area)area = temp*Cnt;
}
for (int j = 0; j <= Cnt; ++j)s.push(heights[i]);
}
++i;
}
return area;
}
};