1 84. 柱状图中最大的矩形
思路和难点见注释。结合题解AC:
class Solution {
public:
int largestRectangleArea(vector<int>& heights)
{
// 【思路】
// 找到当前列左边比当前列小的第一个
// 找到当前列右边比当前列小的第一个
stack<int> sk;
// 【难点1】栈头到栈底是从大到小的!
// 原因是:只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。
sk.push(0);
int ans = 0;
/*【难点2】下面这两行——为了解决[1,2,3]递增 [3,2,1]递减这样的样例*/
heights.insert(heights.begin(), 0); // 数组头部加入元素0
heights.push_back(0); // 数组尾部加入元素0
for(int i = 1; i < heights.size();i++)
{
if(heights[i] > heights[sk.top()])
{
sk.push(i);
}
else if(heights[i] == heights[sk.top()])
{
sk.pop(); //不重复计算 而不pop其实也可以
sk.push(i);
}
else
{
while(!sk.empty() && heights[i] < heights[sk.top()])
{
// 以这个top的高为高的最大的ans
int tmp = sk.top();
sk.pop();
if(!sk.empty())
{
int h = heights[tmp];
int w = i - sk.top() - 1;
ans = max(ans,h*w);
}
}
sk.push(i);
}
}
return ans;
}
};