1277. 统计全为 1 的正方形子矩阵

Problem: 1277. 统计全为 1 的正方形子矩阵

文章目录

思路

动态规划。

解题过程

dp[i] 表示为以该位置为右下角的正方形的个数,状态转移方程为某位置的左,左上和上方位置的dp表的数值的最小值 + 1。

复杂度

  • 时间复杂度: O ( m ∗ n ) O(m*n) O(m∗n)

  • 空间复杂度: O ( m ∗ n ) O(m*n) O(m∗n)

Code

cpp 复制代码
class Solution {

public:

    int countSquares(vector<vector<int>>& matrix) {

        int ret = 0, m = matrix.size(), n = matrix[0].size();



        vector<vector<int>> dp(m, vector<int>(n));

        for (int i = 0; i < m; i++)

            for (int j = 0; j < n; j++)

                if (matrix[i][j] && i && j &&

                    matrix[i][j - 1] && matrix[i - 1][j])

                    dp[i][j] = min({

                        dp[i - 1][j - 1],

                        dp[i][j - 1],

                        dp[i -1][j]

                    }) + 1;

                else if (matrix[i][j])

                    dp[i][j] = 1;



        for (int i = 0; i < m; i++)

            for (int j = 0; j < n; j++)

                ret += dp[i][j];




        return ret;

    }

};