原题链接:最大正方形
个人解法
思路:
这题与之前做过的求二维最大矩形比较类似,但这题有限制条件就是只能为正方形,那么我们就可以利用二维前缀和来做,我们枚举起始点,那么第二个坐标我们只需枚举边长即可。
时间复杂度: O ( n m ∗ n 2 + m 2 ) O(nm*\sqrt{n^2+m^2}) O(nm∗n2+m2)
代码:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
vector<vector<int>> s(n + 1, vector<int> (m + 1));
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= m;j ++) {
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + (matrix[i - 1][j - 1] - '0');
}
}
int res = 0;
for(int x1 = 1;x1 <= n;x1 ++) {
for(int y1 = 1;y1 <= m;y1 ++) {
for(int k = 0;x1 + k <= n && y1 + k <= m;k ++) {
int x2 = x1 + k, y2 = y1 + k;
int area = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
if(area == (k + 1)*(k + 1)) res = max(res, area);
}
}
}
return res;
}
};