84.柱状图中最大的矩形
力扣题目链接
思路
双指针法
动态规划
单调栈
代码
双指针法
class Solution {
public:
//双指针法
int largestRectangleArea(vector<int>& heights) {
int maxSquare=0;
for(int i=0;i<heights.size();i++){
int left=i,right=i;
for(;left>=0;left--){
if(heights[left]<heights[i]) break;
}
for(;right<heights.size();right++){
if(heights[right]<heights[i]) break;
}
maxSquare=max(maxSquare,(right-left-1)*heights[i]);
}
return maxSquare;
}
};
动态规划
class Solution {
public:
// 动态规划
int largestRectangleArea(vector<int>& heights) {
vector<int> left(heights.size()); // left[i] 表示[0,i]第一个位置小于left[i]的下标
vector<int> right(heights.size()); // right[i] 表示[0,i]第一个位置小于right[i]的下标
// 建立left数组
left[0]=-1;
for(int i=1;i<heights.size();i++){
int j=i-1;
while(j>=0&&heights[i]<=heights[j]){
j=left[j];
}
left[i]=j;
}
// 建立right数组
right[heights.size()-1]=heights.size();
for(int i=heights.size()-2;i>=0;i--){
int j=i+1;
while(j<heights.size()&&heights[i]<=heights[j]){
j=right[j];
}
right[i]=j;
}
// 计算最大面积
int res=0;
for(int i=0;i<heights.size();i++){
res=max((right[i]-left[i]-1)*heights[i],res);
}
return res;
}
};
单调栈
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//栈底到栈顶递增排列
heights.insert(heights.begin(), 0); // 数组头部加入元素0
heights.push_back(0); // 数组尾部加入元素0
stack<int> st;
st.push(0);
int res=0;
for(int i=1;i<heights.size();i++){
while(!st.empty()&&heights[i]<heights[st.top()]){
int mid=heights[st.top()];
st.pop();
if(!st.empty()){
res=max(res,(i-st.top()-1)*mid);
}
}
st.push(i);
}
return res;
}
};