lintcode-436-最大正方形
436-最大正方形
在一个二维01矩阵中找到全为1的最大正方形
样例
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4标签
动态规划 爱彼迎 脸书
思路
使用动态规划,可以直接在 matrix 数组上修改,matrix[i][j] 表示以 i, j 为右下角的正方形的边的大小
- matrix[i][j] = 0 时,此点不能构成正方形,以 i, j 为右下角的正方形的边的大小为 0
- matrix[i][j] = 1 时,此点可以构成正方形,以 i, j 为右下角的正方形的边的大小为 min(以 i-1, j 为右下角的正方形的边的大小,以 i, j-1 为右下角的正方形的边的大小,以 i-1, j-1 为右下角的正方形的边的大小)+1
- 在遍历时同时保存最大边
- 正方形大小为边的平方
code
class Solution {
public:
/**
* @param matrix: a matrix of 0 and 1
* @return: an integer
*/
int maxSquare(vector<vector<int> > &matrix) {
// write your code here
int sizeRow = matrix.size();
if (sizeRow <= 0) {
return 0;
}
int sizeCol = matrix[0].size();
if (sizeCol <= 0) {
return 0;
}
int maxCount = matrix[0][0];
for (int i = 1; i < sizeRow; i++) {
for (int j = 1; j < sizeCol; j++) {
if (matrix[i][j] > 0 && matrix[i - 1][j] > 0 && matrix[i][j - 1] > 0 && matrix[i - 1][j - 1] > 0) {
matrix[i][j] = min(matrix[i - 1][j - 1], min(matrix[i - 1][j], matrix[i][j - 1])) + 1;
maxCount = max(maxCount, matrix[i][j]);
}
}
}
return maxCount * maxCount;
}
};