lc1074.元素和为目标值的子矩阵数量

news2024/11/25 11:32:12

创建二维前缀和数组

两个for循环,外循环表示子矩阵的左上角(x1,y1),内循环表示子矩阵的右下角(x2,y2)

两个for循环遍历,计算子矩阵的元素总和

四个变量,暴力破解的时间复杂度为O(m^2*n^2)(m、n为matrix数组的行数和列数)

优化

计算每一行的前缀和,而不是整个矩阵的前缀和。

取不同的两个列(j1,j2),计算以这两个列为边界计算每一行的前缀和(这就是二维前缀和)

这样就可以减少一个变量遍历,时间复杂度为O(m^2*n)(m、n为matrix数组的行数和列数)

代码

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

public class SubmatrixNumber {
    @Test
    public void test() {
        int[][] matrix = new int[][]{{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
//        for (int[] arr:getPrefixAnd(matrix)) {
//            for (int i:arr) {
//                System.out.print(i+" ");
//            }
//            System.out.println();
//        }
        System.out.println(submatrixNumber(matrix, 0));//4
        int[][] matrix1 = new int[][]{{1, -1}, {-1, 1}};
        System.out.println(submatrixNumber(matrix1, 0));//5
        int[][] matrix2 = new int[][]{{904}};
        System.out.println(submatrixNumber(matrix2, 0));//0
    }

    public static int submatrixNumber(int[][] matrix, int target) {
        int[][] sum = getPrefixAnd1(matrix);
        int ans = 0;
        Map<Integer, Integer> count = new HashMap<>();//负责记录计算出的每两列之间的前缀和出现的次数

        int endY = 1;
        while (endY <= matrix[0].length) {
            for (int startY = 0; startY < endY; startY++) {//两个列的边界
                int prefixAnd = 0;
                count.clear();//两个列的边界不同,此时计算出的前缀和不同,负责记录的map集合需要初始化
                count.put(0, 1);//当矩阵为空时,需要记录0出现了1次

                for (int k = 1; k <= matrix.length; k++) {//遍历行
                    prefixAnd += (sum[k][endY] - sum[k][startY]);//计算以这两个列为边界计算每一行的前缀和
                    if (count.containsKey(prefixAnd - target)) {//count集合中是否存在key值为temp-target的数,即为temp-target这个数是否是第一次出现
                        ans += count.get(prefixAnd - target);//不是第一次,则取value值加上
                    }
                    count.put(prefixAnd, count.getOrDefault(prefixAnd, 0) + 1);//记录次数加一
                    //defaultValue - 当指定的key并不存在映射关系中,则返回的该默认值
                    //即如果是第一次出现,则默认的次数记为0
                }
            }
            endY++;
        }
        return ans;
    }




    public static int[][] getPrefixAnd(int[][] matrix) {
        int[][] sum = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (i == 0 && j > 0) {//第一行
                    sum[i][j] = sum[i][j - 1] + matrix[i][j];
                } else if (j == 0 && i > 0) {
                    sum[i][j] = sum[i - 1][j] + matrix[i][j];
                } else if (i == 0 && j == 0) {
                    sum[0][0] = matrix[0][0];
                } else {
                    sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + matrix[i][j];
                }
            }
        }
        return sum;

    }


    //sum[0][0] == 0
    public static int[][] getPrefixAnd1(int[][] matrix) {
        int[][] sum = new int[matrix.length+1][matrix[0].length+1];
        for (int i = 1; i <= matrix.length; i++) {
            for (int j = 1; j <= matrix[0].length; j++) {
                sum[i][j] = sum[i][j - 1] + matrix[i - 1][j - 1];
            }
        }
        return sum;
    }
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点云处理——terrasolid教程

加载terrasolid软件模块 3、通过microstation的utilities->mdl applications加载terrasolid四个模块,加载成功后将显示tscan和tphoto的主窗口&#xff0c;以及四个模块的主工具箱。 浏览点云 4、显示点云坐标信息(类&#xff0c; 航带号&#xff0c;GPS信息&#xff0c;东…

小夜灯的体势红外传感器 > 红外知识学习

红外是电磁辐射谱中的一部分&#xff0c;它位于可见光谱的红色边缘之外&#xff0c;具有较长的波长。可见光谱是人眼能够感知的电磁辐射范围&#xff0c;而红外光的波长较长&#xff0c;人眼无法感知。 生命光的范围是6~14um 红外光的波长范围一般约为0.7um~1000um&#xff08;…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…

打通数据治理全链路,火山引擎DataLeap数据治理平台公有云版本正式发布

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎DataLeap正式对外发布数据治理平台公有云版。DataLeap是火山引擎大数据研发治理套件&#xff0c;随着其子套件数据治理平台与CDH引擎底座成…

等待已久,新品上市 | RevPi Connect 4系列:基于树莓派CM4计算模块的全新工业树莓派

新品来袭 势不可挡 备受期待的虹科工业树莓派第四代产品—RevPi Connect 4终于来啦&#xff01;作为全球领先的工业自动化产品&#xff0c;RevPi Connect 4融合了工业树莓派多年技术积累与创新突破&#xff0c;以及现代物联网技术的结晶。无论您是行业领先者、工程师还是智能科…

tinkerCAD案例:29. 摇头娃娃

Research Your Favorite Bobblehead 摇头娃娃 Project Overview: 项目概况&#xff1a; Design and create your favorite Minecraft 3D bobble head. All you need is a computer, 3D printer, spring and your creativity to your favorite Minecraft character in the for…

远程访问本地mysql

文章目录 一、设置本地mysql允许外部访问找到mysql配置文件my.ini &#xff0c;linux环境是my.cnf配置mysql配置文件 二、创建外部访问的mysql用户三、配置mysql用户的权限四、配置防火墙端口五、连接查看本地ip地址 参考 连接命令 mysql -h <host> -P <port> -u &…

Hive/Spark/Yarn: User Not Found 错误和 Kerberos / AD / OpenLDAP 之间的关系与解释

有时候,当你向Spark或Hive提交作业时,可能会遇到如下的错误: 提交作业使用的用户是example-user-1,但是Yarn返回的错误信息是:该用户不存在。类似的问题大多发生在启动了Kerberos的Hadoop集群上,或者集群集成了Windows AD或OpenLDAP后。本文,我们把这个问题梳理清楚并给…

【MySQL】触发器 (十二)

🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…

从SQL注入绕过最新安全狗WAF中学习fuzz

前言 SQL注入并不是很精通&#xff0c;通过实战绕过WAF来进行加强SQL注入能力&#xff0c;希望对正在学习的师傅能有一丝帮助。 安装 安装前言 我是本地搭建的环境进行测试的 环境是windows11phpstudy2018sqli-labs phpstudy的安装我不再复述&#xff0c;这里简单说一下安全…

java 企业工程管理系统软件源码 自主研发,工程行业适用

&#xfeff; 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据…

Acwing.874 筛法求欧拉函数

题目 给定一个正整数n&#xff0c;求1~n中每个数的欧拉函数之和。 输入格式 共—行&#xff0c;包含一个整数n。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示1~n中每个数的欧拉函数之和。 数据范围 1 ≤n ≤106 输入样例: 6输出样例: 12题解 #include…

React(4)

1.属性&#xff08;props&#xff09;初始 状态state都是组件内部写的&#xff0c;也就是A组件内的state就只能A组件里面用&#xff0c;其他组件复用不了。因此属性props就可以。 比如一个导航栏&#xff0c;首页有&#xff0c;购物车有&#xff0c;我的有&#xff0c;他们三个…

DNS泄漏:你的个人信息是否正被公开?

在今天的互联网世界中&#xff0c;数量庞大的个人信息被储存在各种网络平台和服务器上&#xff0c;其中包括我们的姓名、地址、电话号码、电子邮件地址等等。这些信息对我们的生活至关重要&#xff0c;但同时也会使我们面临着网络安全威胁&#xff0c;其中之一便是DNS泄漏。在本…

sdr- spectrum analyzer

0000000000000000675c62dc314764cf 433.92 M 315M

Day03-作业(AxiosElementUI)

作业1&#xff1a; 根据需求完成如下页面数据列表展示 需求&#xff1a;Vue挂载完成后,通过axios发送异步请求到服务端,获取学生列表数据,并通过Vue展示在页面上 获取数据url&#xff1a;http://yapi.smart-xwork.cn/mock/169327/student 素材&#xff1a; <!DOCTYPE html…

算法通关村第三关——双指针的妙用

双指针思想 快慢指针 所谓的双指针其实就是两个变量。双指针思想简单好用&#xff0c;在处理数组、字符串等场景下很常见。看个例子&#xff0c;从下面序列中删除重复元素[1,2,2,2,3,3,3,5,5,7,8]&#xff0c;重复元素只保留一个。删除之后的结果应该为[1,2,3,5,7,8]。我们可以…

小程序开发事件系统设计指引

我们在小程序开发中可能会时常听到事件系统这个词&#xff0c;但却对其背后的技术可能不是非常的理解&#xff0c;今天就准备通过一些实际案例的演示为大家进行解释和说明。 什么是事件&#xff1f; 微信小程序官方文档中解释说&#xff1a;事件是用于子组件向父组件传递数据…

Python+requests+unittest执行接口自动化测试详情

这篇文章主要介绍了Pythonrequestsunittest执行接口自动化测试详情&#xff0c;文章围绕主题展开详细的内容介绍&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参考一下 1、安装requests、xlrd、json、unittest库 <1>pip 命令安装&#xff1a; pip install …

【Web 表单】与用户数据打交道-1(mdn笔记)

0. Web 表单指南 我们将介绍 Web 表单的各个方面&#xff1a;HTML 结构、样式、验证表单数据&#xff0c;以及提交数据到服务器。 基本指南 你的第一个表单 第一次创建 HTML 表单的经验&#xff0c;包括设计一个简单表单、使用正确的 HTML 元素实现它、通过 CSS 添加一些非常简…