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

题目:

截图自官方

 

代码:

思路见注释

class Solution {
    public int countSquares(int[][] matrix) {
        int rowNumber=matrix.length;
        int columnNumber=matrix[0].length;
        int[][] res=new int[rowNumber][columnNumber];
        int resNum=0;
        // 看着图,我们以res[i][j]表示以i,j为右下点的正方形个数。
        // 按行遍历原数组,有三种情况:
        // 1.第一行第一列中的元素,以他们为右下点的正方形最多一个,取决于原数组对应元素的值。
        // else if 2.如果原坐标中对应元素为0,将res[i][j]置为0,表示不存在以i,j为右下点的正方形
        // else 3. 如果原坐标中对应元素为1,此时res[i][j]=另三个小正方形中最小的个数+1
        for(int i=0;i<rowNumber;i++){
            for(int j=0;j<columnNumber;j++){
                if(i==0||j==0){
                    res[i][j]=matrix[i][j];
                }else if(matrix[i][j]==0){
                    res[i][j]=0;
                }else{
                    int temp1=Math.min(res[i][j-1],res[i-1][j-1]);
                    res[i][j]=Math.min(temp1,res[i-1][j])+1;
                }
            resNum+=res[i][j];
            }
        }
        return resNum;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯的统计矩阵c问题是一个经典的算法问题,可以通过编程实现。下面我将用300字中文回答如何实现。 我们可以使用二维前缀和的方法来解决这个问题。首先,我们定义一个二维数组prefixSum,用来存储原始矩阵a中每个位置(i,j)之前所有元素的和。 我们可以通过以下方式计算prefixSum: 1. 遍历矩阵a的每个位置(i,j),计算prefixSum[i][j]: - 如果i=0且j=0,则prefixSum[i][j] = a[i][j]; - 如果i=0且j≠0,则prefixSum[i][j] = prefixSum[i][j-1] + a[i][j]; - 如果i≠0且j=0,则prefixSum[i][j] = prefixSum[i-1][j] + a[i][j]; - 如果i≠0且j≠0,则prefixSum[i][j] = prefixSum[i-1][j] + prefixSum[i][j-1] - prefixSum[i-1][j-1] + a[i][j]。 2. 接下来,我们可以通过计算prefixSum来统计矩阵c的和。对于每个矩阵c,我们可以使用以下方式计算其和: - 定义矩阵c的左上角位置为(i1, j1),右下角位置为(i2, j2); - 如果(i1, j1)为原始矩阵a的左上角,则c的和为prefixSum[i2][j2]; - 如果(i1, j1)为原始矩阵a的第一行,则c的和为prefixSum[i2][j2] - prefixSum[i2][j1-1]; - 如果(i1, j1)为原始矩阵a的第一列,则c的和为prefixSum[i2][j2] - prefixSum[i1-1][j2]; - 其他情况下,c的和为prefixSum[i2][j2] - prefixSum[i1-1][j2] - prefixSum[i2][j1-1] + prefixSum[i1-1][j1-1]。 通过以上的方法,我们可以编写代码来实现这个算法。代码的时间复杂度为O(M*N),其中M和N分别为原始矩阵a的行数和列数。因此,我们可以通过这个方法高效地解决蓝桥杯的统计矩阵c问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值