1、动态规划法
我们使用数组dp记录以当前的元素作为正方形的右下角时,正方形的最大边长。很显然,只要matrix[i][j] == ‘1’,dp[i][j] 至少为 1。但是当matrix[i][j]大于1时,我们可以发现,dp[i][j]的最大边长一定等于dp[i - 1][j - 1]、dp[i - 1][j]、dp[i][j - 1]三者的最小值加1。我们可以这样理解,若dp[i][j]的最大边长为n,则dp[i - 1][j - 1]的最大边长一定为n-1,考虑到正方形内的每一个元素都要是1,则dp[i - 1][j]和dp[i][j - 1]也一定为n-1。若是有一个的值小于n-1为k,则一定会影响到dp[i][j]对应最大正方形的边长使之等于k+1。获得状态转化公式之后我们可以得到代码如下:
class Solution {
public:
int maximalSquare(vector<vector<char>> &matrix) {
vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size(), 0));
int max_length = 0;
for (int i = 0; i < matrix.size(); ++i) {
for (int j = 0; j < matrix[0].size(); ++j) {
if (matrix[i][j] == '1') {
dp[i][j] = 1;
if (i > 0 && j > 0) {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
}
max_length = max(max_length, dp[i][j]);
}
}
return max_length * max_length;
}
};