85. 最大矩形
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
完全想躺平直接用的84题解法:单调栈,时间空间复杂度太大
分析(i==3时略)
典型:
class Solution {
public:
int maxfunction(int a,int b){
return a>b?a:b;
}
int largestRectangleArea(vector<int> heights) {
int n=heights.size();
if(n==0) return 0;
stack<int> height; //存高度
stack<int> subscript; //存高度对应下标
heights.insert(heights.begin(),0); //在heights数组中第一个位置插入0
heights.push_back(0); //在heights数组中尾插0
n=n+2;
height.push(0);
subscript.push(0);
int i=1; //因为heights[0]=0 和下标0已经存进栈height、subscript中了
int maxs=0; //用来存最大面积
int res; //用来存每一次得到的面积
while(i<n){
if(heights[i]>=height.top()){
height.push(heights[i]);
subscript.push(i);
}else{
subscript.pop();
res=(i-subscript.top()-1)*height.top();
height.pop();
maxs=maxfunction(maxs,res);
while(heights[i]<height.top()){ //如果不满足单调递增栈就一直 弹
subscript.pop();
res=(i-subscript.top()-1)*height.top();
height.pop();
maxs=maxfunction(maxs,res);
}
height.push(heights[i]); //可以保证单调递增栈后再压入
subscript.push(i);
}
i++;
}
//此时跳出循环,但栈中仍有为去除元素,接着依次弹出,算出每一次面积,留下最大值
return maxs;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int row=matrix.size();
int column=matrix[0].size();
vector<vector<int>> dp(row,vector<int>(column));
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
dp[i][j]=matrix[i][j]-'0';
}
}
int n=dp.size();
int maxx=0;
vector<int> zhuzi(column);
for(int i=0;i<row;i++){ //第一行为地平线柱子高度,第二行为地平线柱子高度。。。
for(int j=0;j<column;j++){
zhuzi[j]=0; //每轮让每列柱子高度初始化为0
if(dp[i][j]==0){
zhuzi[j]=0;
}else{
for(int k=i;k>=0;k--){
if(dp[k][j]!=0) {zhuzi[j]=zhuzi[j]+dp[k][j];}
else break;
}
}
}
maxx=maxfunction(maxx,largestRectangleArea(zhuzi)); //求出每次不同地平线时所有柱子能形成的最大矩形面积
}
return maxx;
}
};
下面给自己看的。。。。
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int maxfunction(int a,int b){
return a>b?a:b;
}
int largestRectangleArea(vector<int> heights) {
int n=heights.size();
if(n==0) return 0;
stack<int> height; //存高度
stack<int> subscript; //存高度对应下标
heights.insert(heights.begin(),0); //在heights数组中第一个位置插入0
heights.push_back(0); //在heights数组中尾插0
n=n+2;
height.push(0);
subscript.push(0);
int i=1; //因为heights[0]=0 和下标0已经存进栈height、subscript中了
int maxs=0; //用来存最大面积
int res; //用来存每一次得到的面积
while(i<n){
if(heights[i]>=height.top()){
height.push(heights[i]);
subscript.push(i);
}else{
subscript.pop();
res=(i-subscript.top()-1)*height.top();
height.pop();
maxs=maxfunction(maxs,res);
while(heights[i]<height.top()){ //如果不满足单调递增栈就一直 弹
subscript.pop();
res=(i-subscript.top()-1)*height.top();
height.pop();
maxs=maxfunction(maxs,res);
}
height.push(heights[i]); //可以保证单调递增栈后再压入
subscript.push(i);
}
i++;
}
//此时跳出循环,但栈中仍有为去除元素,接着依次弹出,算出每一次面积,留下最大值
return maxs;
}
// vector<int> maximalRectangle(vector<vector<int>>& matrix) {
int maximalRectangle(vector<vector<int>>& matrix) {
int row=matrix.size();
int column=matrix[0].size();
vector<vector<int>> dp(row,vector<int>(column));
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
dp[i][j]=matrix[i][j];
}
}
int n=dp.size();
int maxx=0;
vector<int> zhuzi(column);
for(int i=0;i<row;i++){ //第一行为地平线柱子高度,第二行为地平线柱子高度。。。
for(int j=0;j<column;j++){
zhuzi[j]=0; //每轮让每列柱子高度初始化为0
if(dp[i][j]==0){
zhuzi[j]=0;
}else{
for(int k=i;k>=0;k--){
if(dp[k][j]!=0) {zhuzi[j]=zhuzi[j]+dp[k][j];}
else break;
}
}
//====================
}
// return zhuzi;
maxx=maxfunction(maxx,largestRectangleArea(zhuzi)); //求出每次不同地平线时所有柱子能形成的最大矩形面积
// return maxx;
}
return maxx;
// return zhuzi;
}
int main(){
vector<vector<int>> matrix={{1,0,1,0,0},{1,0,1,1,1},{1,1,1,1,1},{1,0,0,1,0}};
printf("%d",maximalRectangle(matrix));
// for(int i=0;i<5;i++) printf("%d ",maximalRectangle(matrix)[i]);
return 0;
}