Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
Example:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
方法1:动态规划
重要的是要找到递推关系res[m][n]=min(res[m-1][n],min(res[m][n-1],res[m-1][n-1]))+1;
res[m][n]代表以此点为右下角顶点的正方形的边长。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int h=matrix.size();
if(h==0) return 0;
int l=matrix[0].size();
int maxN=0;
vector<vector<int>> res(h,vector<int>(l,0));
for(int i=0;i<l;i++){
if(matrix[0][i]=='1') res[0][i]=1;
maxN=max(maxN,res[0][i]);
}
for(int j=0;j<h;j++){
if(matrix[j][0]=='1') res[j][0]=1;
maxN=max(maxN,res[j][0]);
}
for(int m=1;m<h;m++){
for(int n=1;n<l;n++){
if(matrix[m][n]=='0') {
res[m][n]=0;
}
else{
res[m][n]=min(res[m-1][n],min(res[m][n-1],res[m-1][n-1]))+1;
maxN=max(maxN,res[m][n]);
}
}
}
return maxN*maxN;
}
};
Tips:
此类题型技巧:由于每个点与他的左,上,左上点有关,先将二维数组的第一列和第一行初始化,再根据地推公式从左到右,从上到下递推。
二维vector初始化方法:vector<vector<int>> res(h,vector<int>(l,0));
min和max可直接用。
方法2:暴力求解:遍历每一个点,以此点为正方形的左上角,计算边长数
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int h=matrix.size();
if(h==0) return 0;
int l=matrix[0].size();
int maxN=0;
for(int i=0;i<h;i++){
for(int j=0,m;j<l;j++){
m=0;
for(int t1,t2;m+i<h&&m+j<l;m++){
for(t1=j;t1<=j+m;t1++){
if(matrix[m+i][t1]!='1'){
break;
}
}
for(t2=i;t2<=i+m;t2++){
if(matrix[t2][m+j]!='1') {
break;
}
}
if(t1!=(j+m+1)||t2!=(i+m+1)) break;
}
maxN=max(m,maxN);
}
}
return maxN*maxN;
}
};
Tips:将m初始化为0,放在for里面只会初始化一次
参考链接: