标签:vector rectangle 矩形 图片 amp i++ pre curl turn
题意:
题解:
我们知道最大矩形一定是由矩形中某个点向上延伸直到为‘0’,然后往左右延伸(在高度得到保证的情况下左右伸展)的矩形
因此我们通过遍历每一行来求取对于以每个点来说的最大矩形并获得最大值
这里最关键的一点就是当遍历到某一个点的上面的那个点为‘0’,此时该点的左右延伸长度不在与上一行进行比较,而实从本行重新开始,
这里十分精妙,具体体现在程序中的当该点为‘0’时 l[j]=0和 r[j]=n,通过这一赋值可以避免下一行的左右延伸长度与上一行进行比较。
class Solution { public: int maximalRectangle(vector<vector<char>>& matrix) { int m=matrix.size(); if(m==0) return 0; int n=matrix[0].size(); int area=0; vector<int> l(n,0); vector<int> r(n,n); vector<int> h(n,0); for(int i=0;i<m;i++) { int curl=0,curr=n; for(int j=0;j<n;j++) { if(matrix[i][j]==‘0‘) { curl=j+1; l[j]=0; } else { l[j]=max(l[j],curl); } } for(int j=n-1;j>=0;j--) { if(matrix[i][j]==‘0‘) { curr=j; r[j]=n; } else { r[j]=min(r[j],curr); } } for(int j=0;j<n;j++) { if(matrix[i][j]==‘1‘) { h[j]=h[j]+1; area=max(area,h[j]*(r[j]-l[j])); } else { h[j]=0; } } } return area; } };
标签:vector rectangle 矩形 图片 amp i++ pre curl turn
原文地址:https://www.cnblogs.com/QingFengDaHui/p/12464027.html