1、单调栈
考虑到题目要求,我们需要找到某个元素之前第一个比他小的数以及其后第一个比他小的数,因此我们可以考虑使用单调栈进行解决。我们定义一个单调递增的单调栈记录元素的位置,一旦遇到一个比栈顶元素对应的高度小的值,则将栈顶元素出栈。在出栈之后,新的栈顶元素就是出栈元素之前第一个比他小的数,i对应的就是出栈元素之后第一个比他小的数,我们用距离诚意高度即可计算当前的矩形面积。以此类推,不断改变单调栈中的元素并计算面积的最大值。
值得注意的是,为了避免出现数组中都是递增的情况,我们可以在原数组的首尾添加两个相同无意义的-1项用于确保最后一定会全部出栈,从而能够计算最大面积,避免了对于出栈不完全情况的讨论。
此外,由于在C++中使用栈的时间复杂度高于容器,操作少于容器,我们可以考虑在实现时使用容器代替栈。
class Solution {
public:
int largestRectangleArea(vector<int> &heights) {
int result = INT_MIN;
stack<int> st;
heights.insert(heights.begin(), -1);
heights.push_back(-1);
for (int i = 0; i < heights.size(); ++i) {
while (!st.empty() && heights[st.top()] > heights[i]) {
int cur = st.top();
st.pop();
int left = st.top() + 1;
int right = i;
result = max((right - left) * heights[cur], result);
}
st.push(i);
}
return result;
}
};