美文网首页算法代码
统计全为 1 的正方形子矩阵

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

作者: windUtterance | 来源:发表于2020-05-30 12:31 被阅读0次

    题目描述
    给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。

    示例
    输入:matrix =
    [
    [0,1,1,1],
    [1,1,1,1],
    [0,1,1,1]
    ]
    输出:15
    解释:
    边长为 1 的正方形有 10 个。
    边长为 2 的正方形有 4 个。
    边长为 3 的正方形有 1 个。
    正方形的总数 = 10 + 4 + 1 = 15.

    首先,题目并不关心边长为1,2,...,k的各有多少个,并且我们知道,以(i, j)为右下角边长为k的正方形全为1的话,那么以(i, j)为右下角边长分别为1,2,...,k - 1的正方形区域一定是全为1,如下图:

    image.png

    上图中,如果红色区域是边长为3的全1正方形区域,那么它一定包含了一个边长为2和边长为1的全1正方形区域。所以,我们只需记录以(i, j)为右下角的区域包含的最大全1正方形边长即可,这个最大边长也即以(i , j)为右下角的全1正方形的个数.
    那么基于此,我们就可以将原始的dp降一维度,设dp[i][j]表示以(i, j)为右下角的最大全1正方形区域的边长,则有如下状态转移方程:

    dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1

    作者:97wgl
    链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/solution/tong-ji-quan-wei-1-de-zheng-fang-xing-zi-ju-zhen-f/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    Java代码

    class Solution {
        public int countSquares(int[][] matrix) {
            int row = matrix.length;
            int col = matrix[0].length;
            int[][] dp = new int[row][col];
            int ans = 0;
    
            for(int i = 0;i < row;i++) {
                ans += dp[i][0] = matrix[i][0];
            }
            for(int j = 0;j < col;j++) {
                ans += dp[0][j] = matrix[0][j];
            }
            if(matrix[0][0] == 1) ans--;
    
            for(int i = 1;i < row;i++) {
                for(int j = 1;j < col;j++) {
                    if(matrix[i][j] == 1) {
                        dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][ j - 1]), dp[i - 1][j - 1]) + 1;
                        ans += dp[i][j];
                    }
                }
            }
            return ans;
        }
    }
    

    相关文章

      网友评论

        本文标题:统计全为 1 的正方形子矩阵

        本文链接:https://www.haomeiwen.com/subject/xjyczhtx.html