看了题解
暴力是n的平方复杂度。以每个柱子的高度为基准,找到延伸到两边最远的距离,计算距离,计算出所有情况中最大值。
双指针写法优化:
通过找到每个柱子的左边的小于该柱子高度的第一个柱子下标(动态规划,如果左侧第一个柱子高度大于当前柱子高度,就转为求左侧第一个柱子左侧小于左侧第一个柱子高度的柱子下标),右边类似。
单调栈写法:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack <int> st;
st.push(0);
int index=1;
heights.insert(heights.begin(),0);
heights.push_back(0);
int mi=0;
while(!st.empty()&&index<heights.size()){
while(!st.empty()&&index<heights.size()&&heights[index]>heights[st.top()]){
st.push(index);
index++;
}
while(!st.empty()&&index<heights.size()&&heights[index]==heights[st.top()]){
st.pop();
st.push(index);
index++;
}
while(!st.empty()&&index<heights.size()&&heights[index]<heights[st.top()]){
int mid=st.top();
st.pop();
if(!st.empty()){
int left=st.top();
int right=index;
mi=max(mi,(right-left-1)*heights[mid]);
}
}
st.push(index);
index++;
}
return mi;
}
};