执行用时 : 28 ms, 在Maximal Square的C++提交中击败了93.30% 的用户
内存消耗 : 10.5 MB, 在Maximal Square的C++提交中击败了96.69% 的用户
定义一个和题目给定大小一样的二维数组,dp[i][j]表示在i , j 位置可以构成的最大正方形的边长
递推式为:dp[i][j] = min( dp[i - 1][j] , min( dp[i][j - 1] , dp[i - 1][j - 1] ) ) + 1;
取最小是因为每个点的左,上,左上再往外蔓延不一定是1,有可能是0,如果不取最小就会取多了
比如 3 ,2的点就只能往三个方向中取最小的,最后找到最大边长,平方返回即可。
"0","0","0","1"
"1","1","0","1"
"1","1","1","1"
"0","1","1","1"
"0","1","1","1"
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if( matrix.size() == 0 ){
return 0;
}
int m = matrix.size();
int n = matrix[0].size();
int dp[m][n];
memset( dp , 0 , sizeof(dp) );
for( int i = 0 ; i < n ; i++ ) if( matrix[0][i] == '1' ) dp[0][i] = 1;
for( int i = 0 ; i < m ; i++ ) if( matrix[i][0] == '1' ) dp[i][0] = 1;
for( int i = 1 ; i < m ; i++ ){
for( int j = 1 ; j < n ; j++ ){
if( matrix[i][j] == '1' ){
dp[i][j] = min( dp[i - 1][j] , min( dp[i][j - 1] , dp[i - 1][j - 1] ) ) + 1;
}
}
}
int ans = -1;
for( int i = 0 ; i < m ; i++ ){
for( int j = 0 ; j < n ; j++ ){
ans = max( ans , dp[i][j] );
}
}
return ans * ans;
}
};