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

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 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.
示例 2:

输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.

提示:

1 <= arr.length <= 300
1 <= arr[0].length <= 300
0 <= arr[i][j] <= 1

1.

/**
 * @param {number[][]} matrix
 * @return {number}
 */
var countSquares = function(matrix) {
    let temp  = [];
    let width = 0;
    let length = 0;
    let min = (matrix.length>matrix[0].length?matrix[0].length:matrix.length)-1;

    while(width<=min){
        length = 0;
        for(let i=0;i<matrix.length;i++){
            for(let j=0;j<matrix[0].length;j++){
                if(matrix[i][j]!=0){
                    let flag = true;
                    for(let k=0;k<=width;k++){
                        for(let z=0;z<=width;z++){
                           if(i+k>=matrix.length||j+z>=matrix[0].length||matrix[i+k][j+z]==0){

                               flag = false;
                               break;
                           }
                        }
                    }
                    if(flag == true){
                        length++;
                    }
                }

            }
        }

        temp.push(length);
        width++;
    }

   return temp.reduce((pre,item)=>{return pre+item},0)
};

超时错误

实现:循环测试边长为n的正方形的个数,正方形的判断方式当其向右移动n位和向下移动n位的范围内的所有的元素都得是1才能是正方形。超时的主要问题是,之前计算的结果没有被利用

2.

class Solution {
    public int countSquares(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int len = Math.min(m, n);
        boolean[][][] dp = new boolean[m][n][len];
        int count = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dp[i][j][0] = (matrix[i][j] == 1);
                count += dp[i][j][0] ? 1 : 0;
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                for (int k = 1; k < len; k++) {
                    dp[i][j][k] = (matrix[i][j] == 1 && dp[i - 1][j][k - 1] && dp[i][j - 1][k - 1] && dp[i - 1][j - 1] [k - 1]);
                    if (dp[i][j][k]) {
                        count++;
                    }
                }
            }
        }
        return count;
    }

}

/**
 * @param {number[][]} matrix
 * @return {number}
 */
var countSquares = function(matrix) {
    let temp = [];
    let count=0;
    let min_length = Math.min(matrix.length,matrix[0].length);
    //初始化三维数组
    for(let i=0;i<matrix.length;i++){
       let demo = new Array(matrix[0].length);
       for(let j=0;j<matrix[0].length;j++){
            demo[j] = new Array(min_length);
            for(let k=0;k<min_length;k++){
                demo[j][k] = 0;
            }

       }
       temp.push(demo)
    }

    //边长为1的正方形个数
    for(let i=0;i<matrix.length;i++){
        for(let j=0;j<matrix[0].length;j++){
            temp[i][j][0] = (matrix[i][j] === 1?1:0); //循环判断当前的元素是否边长为1
            if(temp[i][j][0]){
                count++;//边长为1的个数
            }
        }
    }

    //从2开始的编程
    for(let i=1;i<matrix.length;i++){
        for(let j=1;j<matrix[0].length;j++){
            for(let k = 1;k<min_length;k++){
                temp[i][j][k] = (matrix[i][j] === 1&& temp[i-1][j][k-1] && temp[i-1][j-1][k-1] && temp[i][j-1][k-1])
                if(temp[i][j][k]){
                    count++;
                }
            }
        }
    }
    return count;
};

javscript实现

实现:判断当前位置是否是边长为n的正方形,需要判断,在当前位置之前的边长为n的范围内是否全是1,是则说明是n正方形。

  如何判断确定之前的正方形是否是1,主要判断,(i-1,j),(i-1,j-1),(i,j-1)是否是边长为n-1的正方形。

  充分利用之前的计算结果。

dp[i][j][k] = (matrix[i][j] == 1 && dp[i - 1][j][k - 1] && dp[i][j - 1][k - 1] && dp[i - 1][j - 1] [k - 1]);

来源: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)
链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/panjingshuang/p/11977071.html

时间: 2024-08-11 11:53:10

统计全为 1 的正方形子矩阵 统计正方形的个数的相关文章

codevs 1259 最大正方形子矩阵 WD

1259 最大正方形子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0. 输入描述 Input Description 第一行有两个整数n和m(1<=n,m<=1000).接下来的n行,每行有m个0或1的数字.每两个数字之间用空格隔开. 输出描述 Output Descr

60.编程统计数组a中正数、0、负数的个数

#include<iostream> using namespace std; int main() { int x=0,y=0,z=0; int a[10]; cout<<"please input 10 numbers:"<<endl; for(int i=0;i<10;i++) { cin>>a[i]; } for(int j=0;j<10;j++) { if(a[j]==0) { x++; } } for(int m=

51nod 1158 全是1的最大子矩阵

题目链接:51nod 1158 全是1的最大子矩阵 题目分类是单调栈,但是直接用与解最大子矩阵类似的办法水过了.. 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #define CLR(a,b) memset((a),(b),sizeof((a))) 6 using namespace std; 7 const int N = 501; 8 c

1158 全是1的最大子矩阵

1158 全是1的最大子矩阵 基准时间限制:1 秒 空间限制:131072 KB 给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的.输出M2的面积. Input 第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500) 第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1. Output 输出最大全是1的子矩阵的面积. Input示例 3 3 1 1 0 1 1 1 0 1 1 Output示例 4思路:

51nod1158 全是1的最大子矩阵

跟最大子矩阵差不多O(n3)扫一下.有更优写法?挖坑! #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) int read(){ int x=0;ch

【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

[转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics凭借其强大的功能和超强的稳定性.快速的反应能力.广泛的数据应用功能,受到了广大站长的追捧. 使用Google Analytics的站长们应该不在少数吧,每天登录Google Analytics免费网站上查看网站的流量也是我们这些站长们必须做的事情,认真分析Google Analytics当中的数据信

流量汇总(自定义jar包,在hadoop集群上 统计,排序,分组)之统计

小知识点: half:关机 yarn端口:8088 删除hdfs目录:hadoop fs -rm -r /wc/output namenode两个状态都是standby原因:zookeeper没有比hdfs先启动 现在来做一个流量统计的例子: 首先数据是这样一张表:见附件 统计:(代码) 1,flowbean: package cn.itcast.hadoop.mr.flowsum; import java.io.DataInput; import java.io.DataOutput; imp

理解统计信息(6/6):统计信息汇总贴

在帮助优化器选择正确的执行计划,统计信息是一个重要因素.因此,我们在处理性能问题时,要足够重视统计信息.可能是对统计信息知识及其相关机制的缺乏,忽略统计信息往往是造成性能问题的根源. 查询优化器在每一步使用统计信息判断返回的行数.在执行计划里的预估行数信息是基于列上的可用统计信息计算而来的.统计信息会给我们列上数据分布信息.没有统计信息,查询优化器不能判断不同计划的效率.通过使用统计信息里的内容,查询优化器在访问数据的时候就可以做出正确选择. 在SQL Server里存储的统计信息包括密度和直方

第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据. 在创建列的统计信息后,在DML操作如insert.update.delete后,统计信息就会过时.因为这些操作更改了数据,影响了数据分布.此时需要更新统计信息. 在高活动的表中,统计信息可能几个小时就会过时.对于静态表,可能几个星期才会过时.这要视乎表上DML的操作. 从2000开始,