84、柱状图中最大的矩形
1)局部峰值求解
维护一个局部峰值minH,得到局部峰值之后,向左侧依次拓展,时间复杂度较高
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n=heights.size(),res=0;
for(int i=0;i<n;i++){
while(i<n-1 && heights[i]<=heights[i+1]) i++;
int minH=heights[i];
for(int j=i;j>=0;j--){
minH=min(minH,height[j]);
int area=(j-i+1)*minH;
res=max(res,area);
}
}
return res;
}
};
2)递增栈求解
递增栈求解 维护一个递增栈,当当前元素小于栈顶元素时候,开始触发,接下来求解结果,如下
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
int n=heights.size(),res=0;
stack<int> sta;
for(int i=0;i<n;i++){
while(!sta.empty() && heights[sta.top()]>=heights[i]){
int cur=sta.top();
sta.pop();
res=max(res,heights[cur]*(sta.empty()?i:i-sta.top()-1));
}
sta.push(i);
}
return res;
}
};
85、最大矩形
期初以为这道题目需要用动态规划求解,类似于最大正方形那样,不过真的太难了,想不出来,因此找了一个简单的方法,结合柱状图中最大矩形的面积求解,实现如下:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty() || matrix[0].empty()) return 0;
int m=matrix.size(),n=matrix[0].size();
vector<int> height(n,0);
int j=0,res=0;
while(j<m){
for(int i=0;i<n;i++){
if(matrix[j][i]=='0') height[i]=0;
else height[i]+=1;
}
res=max(res,largestRectangleArea(height));
j++;
}
return res;
}
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
int n=heights.size(),res=0;
stack<int> sta;
for(int i=0;i<n;i++){
while(!sta.empty() && heights[sta.top()]>=heights[i]){
int cur=sta.top();
sta.pop();
res=max(res,heights[cur]*(sta.empty()?i:i-sta.top()-1));
}
sta.push(i);
}
return res;
}
};