题目
思路 动态规划
使用dp二维数组表示正方形的最大边长,最终返回最大边长的平方。最大边长是左上的值、左边的值和上面的值的最小值+1。
代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int ans = 0, m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(matrix[i][j] == '1')
dp[i + 1][j + 1] = min(min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
ans = max(ans, dp[i + 1][j + 1]);
}
}
return ans * ans;
}
};
优化思路
因为只需要用到每个点周边的值,所以可以只用一个一维dp数组表示列的最大边。
优化代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int ans = 0, m = matrix.size(), n = matrix[0].size();
vector<int> dp(n + 1, 0);
for(int i = 0; i < m; i++){
int northwest = 0;
for(int j = 0; j < n; j++){
int nextNorthwest = dp[j + 1];
if(matrix[i][j] == '1'){
dp[j + 1] = min(min(dp[j + 1], dp[j]), northwest) + 1;
ans = max(ans, dp[j + 1]);
}else dp[j + 1] = 0;
northwest = nextNorthwest;
}
}
return ans * ans;
}
};