最大正方形(难度:中等)
该题对应力扣网址
思路
min_value=min({dp[i-1][j-1],dp[i-1][j],dp[i][j-1]})
dp[i][j]+=min_value
关键点是正方形的右下角(n>1时),通过画图,可以看出,在基础正方形2×2中,当右下角=1,且其余三块不=0时
以右下角这个小正方形作为可能组成的大正方形的右下角时,那么可能组成的大正方形的边长,就是其他三块的最小边长+它本身的边长
其中,其他三块中每一块的边长指的是,以每一块作为正方形右下角时的最小边长。
AC代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
int flag=0;
vector <vector<int>> dp(m,vector<int>(n));
//初始化dp数组
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
dp[i][j]=matrix[i][j]-'0';
}
}
if(m==1 && n==1){
if(matrix[0][0]=='0'){
return 0;
}
return 1;
}
if(m==1 && n==2){
if(matrix[0][0]=='1' || matrix[0][1]=='1'){
return 1;
}
return 0;
}
if(m==2 && n==1){
if(matrix[0][0]=='1' || matrix[1][0]=='1'){
return 1;
}
return 0;
}
int min_value;
int max_value=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(dp[i][j]!=0){
if(i>0 && j>0){
min_value=min({dp[i-1][j-1],dp[i-1][j],dp[i][j-1]});
if(min_value!=0){
dp[i][j]+=min_value;
}
}
}
if(dp[i][j]>max_value){
max_value=dp[i][j];
}
}
}
return pow(max_value,2);
}
};