题目描述
Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.
Example:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
思路
思路一:通用的解法,先用动态规划求出dp[i][j]表示从0到[i,j]点组成的矩阵的1的个数。之后就可以在O(1)时间内求出任意矩阵的1的个数。遍历起点位置和边长,找到最大的边长。时间复杂度:O(n^3)
思路二:i,j 点能构成的最大边长,取决于i-1,j i-1,j-1 i,j-1三个点能组成正方形的边长最小值+1。时间复杂度:O(n^2)
代码
代码一:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
int m = matrix.size();
int n = matrix[0].size();
vector<vector<int> > dp(m+1, vector<int>(n+1, 0));
for (int i=1; i<=m; ++i) {
for (int j=1; j<=n; ++j) {
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + matrix[i-1][j-1] - '0';
}
}
int res = 0;
for (int i=1; i<=m; ++i) {
for (int j=1; j<=n; ++j) {
for (int k=min(m-i+1, n-j+1); k>=res+1; --k) {
int edx = i+k-1;
int edy = j+k-1;
int sum = dp[edx][edy] - dp[i-1][edy] - dp[edx][j-1] + dp[i-1][j-1];
if (sum == k*k) {
res = max(res, k);
break;
}
}
}
}
return res*res;
}
};
代码二:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.empty()) return 0;
int m = matrix.size();
int n = matrix[0].size();
vector<vector<int> > dp(m+1, vector<int>(n+1, 0));
int res = 0;
for (int i=1; i<=m; ++i) {
for (int j=1; j<=n; ++j) {
if (matrix[i-1][j-1] == '0') dp[i][j] = 0;
else {
dp[i][j] = min(min(dp[i-1][j-1], dp[i-1][j]), dp[i][j-1]) + 1;
res = max(res, dp[i][j]);
}
}
}
return res*res;
}
};