题目描述
84. Largest Rectangle in Histogram
知识点
单调栈
我的实现
码前思考
由于不小心看见了提示,知道了得用单调栈来解题。。。罪过啊
思想就是一个一组连续的矩形,它们能构成的长方形一定是取决于最低点的,所以只需要将每个矩形当作最低点,然后求它们向左向右最大能够延申多长即可。
代码实现
//使用单调栈进行解题
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
int len = heights.size();
//表示左边第一个比自己小的位置
vector<int> left(len,-1);
//表示右边第一个比自己小的位置
vector<int> right(len,len);
//开始单调栈
st.push(0);
for(int i=1;i<len;i++){
while(!st.empty()){
int curTop = st.top();
if(heights[curTop] > heights[i]){
right[curTop] = i;
st.pop();
}else{
break;
}
}
st.push(i);
}
//st.clear();
stack<int> st2;
st2.push(len-1);
for(int i=len-2;i>=0;i--){
while(!st2.empty()){
int curTop = st2.top();
if(heights[curTop] > heights[i]){
left[curTop] = i;
st2.pop();
}else{
break;
}
}
st2.push(i);
}
int maxArea = 0;
for(int i=0;i<len;i++){
int curArea = heights[i]*(right[i]-left[i]-1);
maxArea=max(maxArea,curArea);
}
return maxArea;
}
};
码后反思
加油,单调栈这种题还是能够解决的。
leetcode上有很多求面积的题目,比如下面这些:
11. Container With Most Water
42. Trapping Rain Water
85. Maximal Rectangle