221. 最大正方形 https://leetcode-cn.com/problems/maximal-square/
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
思路:首先找到是1的点,保存为A向量中,然后扩展1位,从A向量中找到距离中心右边1列和下边1行为1的,筛选出保存在A中,然后再扩展1位。即从A向量中找到距离中心右边2列和下边2行为1的,.。。直到A中不存在这样的点。
注意:矩阵的维数比较大。另外给定的不一定是方阵,还有就是相同代码复制的时候特别注意变量!
class Solution {
public:
static const int maxn=100;
int N,M;//N行M列
int maximalSquare(vector<vector<char>>& matrix) {
N=matrix.size();
if(N==0) return 0;
M=matrix[0].size();
int NN=0;
int num=0;
do {
num=solve(matrix,NN,num);
if(num) NN++;
//从b查询结果保存在a里面;
//a copy to B num
copy(num);
cout<<M<<N<<num<<endl;
} while(num);
return NN*NN;
}
int a[200000][2];
int b[200000][2];
int solve(vector<vector<char>>& matrix,int NN,int num) {
int icount=0;
if(NN==0) {
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(matrix[i][j]=='1') {
a[icount][0]=j;
a[icount][1]=i;
icount++;
}
}
}
} else
{
for(int i=0; i<num; i++) {
int x=b[i][0];
int y=b[i][1];
bool flag=true;
if(x+NN<M&&y+NN<N) {
for(int j=y; j<=y+NN; j++)
if(matrix[x+NN][j]!='1') {
flag=false;
break;
}
for(int j=x; j<=x+NN; j++)
if(matrix[j][y+NN]!='1'&&flag) {
flag=false;
break;
}
if(flag) {
a[icount][0]=x;
a[icount][1]=y;
icount++;
}
}
}
}
return icount;
}
void copy(int num) {
for(int i=0; i<num; i++) {
b[i][0]=a[i][0];
b[i][1]=a[i][1];
}
}
};