84. 柱状图中最大的矩形(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:和昨天接雨水的题目类似。双指针做法就是记录每个节点左右两边最小的节点的下标(正好和接雨水相反);单调栈做法也是一样碰见大元素才入栈(和接雨水相反)。
int largestRectangleArea(vector<int>& heights) {
int size = heights.size();
vector<int> midLeft(size, 0);
vector<int> midRight(size, 0);
midLeft[0]=-1;
for(int i=1; i<size; i++){
int t = i-1;
while(t>=0 && heights[t]>=heights[i]) t=midLeft[t];
midLeft[i]=t;
}
midRight[size-1]=size;
for(int i=size-2; i>=0; i--){
int t = i+1;
while(t<size && heights[i]<=heights[t]) t=midRight[t];
midRight[i]=t;
}
int result=0;
for(int i=0; i<size; i++){
int sum = heights[i] * (midRight[i]-midLeft[i]-1);
result = max(result, sum);
}
return result;
}
int largestRectangleArea(vector<int>& heights) {
heights.insert(heights.begin(), 0);
int size = heights.size();
heights.push_back(0);
stack<int> st;
st.push(0);
int result = 0;
for(int i=1; i<size; i++){
if(heights[i]>heights[st.top()]){
st.push(i);
}else if(heights[i]==heights[st.top()]){
st.pop();
st.push(i);
}else{
while(!st.empty() && heights[i]<heights[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int left = st.top();
int right = i;
int w = right - left - 1;
int h = heights[mid];
result = max(result, w * h);
}
}
st.push(i);
}
}
return result;
}