Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Return 4.
题意:给出一个矩阵,用字符0,1填充,求1组成的最大的方格。
思路:画一个二维数组,遇到0对应值写0,遇到1,判断对角线以及左边和上边的值,如果均不为0,则该值等于周围最小的值加1。用dp[m][n]记录点(m, n)时,以点(m ,n)为右下角的方格的边长值,则以该点为右下角点的方格的边长值为dp[m][n] = min{dp[m-1][n-1], dp[m-1][n], dp[m][n-1]}+1。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size();
if (m == 0)
return 0;
int n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0));
int max = 0;
for (int i = 0; i < m; i++){
if (matrix[i][0] == '1')
dp[i][0] = 1, max = 1;
}
for (int i = 0; i < n; i++){
if (matrix[0][i] == '1')
dp[0][i] = 1, max=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 - 1], min(dp[i - 1][j], dp[i][j - 1]))+1;
if (dp[i][j] > max)
max = dp[i][j];
}
}
}
return max*max;
}
};