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;
    }
};
posted @ 2017-08-18 20:50  LiBaoquan  阅读(262)  评论(0编辑  收藏  举报