NO.304 二维区域和检索 - 矩阵不可变

题目

给定一个二维矩阵 matrix,以下类型的多个请求:

  • 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。

实现 NumMatrix 类:

  • NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
  • int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, col1) 、右下角 (row2, col2) 所描述的子矩阵的元素 总和 。


思路

思路一

该题目可以作为一维前缀和的扩展(参见Leecode-303)。

初始化时对矩阵的每一行计算前缀和,检索时对二维区域中的每一行计算子数组和,然后对每一行的子数组和计算总和

时间复杂度:初始化 O(mn),每次检索 O(m),其中 m 和 n 分别是矩阵 matrix的行数和列数。初始化需要遍历矩阵 matrix计算二维前缀和,时间复杂度是 O(mn)。 每次检索需要对二维区域中的每一行计算子数组和,二维区域的行数不超过 m,计算每一行的子数组和的时间复杂度是 O(1),因此每次检索的时间复杂度是 O(m)。

空间复杂度:O(mn),其中 m 和 n 分别是矩阵 matrix的行数和列数。需要创建一个 m行 n+1 列的前缀和数组 sums。

思路二

小学数学,田字形,已知整体面积,上面面积,左边面积,左上面积,求右下角矩形的面积。 右下角矩形的面积=整体面积-上面面积-左边面积+左上面积

根据上述描述,假设我们计算(row1, col1),(row2, col2)之间的值,可以使用以下的公式:

S_{sum} = S_{row2,col2}

S_{top } =S_{row1,col2} - S_{0,0}

S_{left} =S_{row2,col1} - S_{0,0}

S_{topleft} =S_{row1,col1} - S_{0,0}

S_{target}=S_{sum}-S_{top} - S_{left} + S_{topleft}

我们在初始化的时候,可以计算每一个点对应的面积值

时间复杂度:初始化 O(mn),每次检索 O(1),其中 m 和 n 分别是矩阵 matrix的行数和列数。 初始化需要遍历矩阵 matrix 计算二维前缀和,时间复杂度是 O(mn)。 每次检索的时间复杂度是 O(1)。

空间复杂度:O(mn),其中 m 和 n 分别是矩阵 matrix 的行数和列数。需要创建一个 m+1 行 n+1 列的二维前缀和数组 sums。

代码
 

class NumMatrix {int[][] sums;public NumMatrix(int[][] matrix) {int m = matrix.length;if (m > 0) {int n = matrix[0].length;sums = new int[m + 1][n + 1];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {sums[i + 1][j + 1] = sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + matrix[i][j];}}}}public int sumRegion(int row1, int col1, int row2, int col2) {return sums[row2 + 1][col2 + 1] - sums[row1][col2 + 1] - sums[row2 + 1][col1] + sums[row1][col1];}
}

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

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

相关文章

Redis数据库的使用

【官网】https://redis.com/ 【中文官网】https://redis.p2hp.com/ 【官方推荐的客户端】https://redis.io/resources/clients/ 1、Qt连接Redis的方式 第三方库c&#xff1a;【hiredis】https://github.com/redis/hiredis第三方库c&#xff1a;【redis-plus-plus】https://gi…

JS实现数据结构与算法

队列 1、普通队列 利用数组push和shif 就可以简单实现 2、利用链表的方式实现队列 class MyQueue {constructor(){this.head nullthis.tail nullthis.length 0}add(value){let node {value}if(this.length 0){this.head nodethis.tail node}else{this.tail.next no…

LLM代码生成器的挑战【GDELT早期观察】

越来越多的研究开始对LLM大模型生成的代码的质量提出质疑&#xff0c;尽管科技行业不断推出越来越多的旨在增强甚至取代人类编码员的工具。 随着我们&#xff08;GDELT&#xff09;继续探索和评估越来越多的此类工具&#xff0c;以下是我们的一些早期观察结果。 在线工具推荐&a…

【ARM Coresight OpenOCD 系列 3 -- OpenOCD 常用命令与扫描链scan_chain】

文章目录 1.1 TAP Declaration1.1.1 扫描链 1.2 Autoprobing1.3 DAP declaration (ARMv6-M, ARMv7 and ARMv8 targets) 1.1 TAP Declaration 测试访问端口&#xff08;TAP&#xff09;是JTAG的核心。TAP扮演许多角色&#xff0c;包括&#xff1a; 调试目标&#xff1a;CPU TA…

linux安装git

目录 声明 前言 正文 &#xff08;1&#xff09;下载git压缩包 &#xff08;2&#xff09;git压缩包解压 &#xff08;3&#xff09;解压完成后需要进行源码的编译操作 a.首先进去到解压后的文件目录中&#xff1a; b.执行&#xff1a; 编译的过程中可能遇到的问题&am…

设计模式案例 (三)

文章目录 系列文章目录前言一、单例模式懒汉模式case 包饿汉模式case 包懒汉模式枷锁case 包 系列文章目录 第一章 设计模式案例 (一) 第二章 设计模式案例 &#xff08;二) 第三章 设计模式案例 &#xff08;二) 文章目录 系列文章目录前言一、单例模式懒汉模式case 包饿汉模…

给OFFICE增加一个功能搜索

OFFICE功能几乎是无限的。不论你怎么熟悉&#xff0c;总有出乎意料的功能。前几天我使用EXCEL时&#xff0c;发现一个功能改名了。于是我就想&#xff0c;OFFICE应该增加一个功能搜索&#xff1a; 提供一个搜索输入栏。这个已经有了。输入搜索字串弹出一个面板&#xff0c;附带…

Spring Boot: 约定优于配置的软件设计思想

文章目录 传统Spring框架的繁琐配置1. **管理jar包依赖**2. **维护web.xml**3. **维护Dispatch-Servlet.xml配置项**4. **应用部署到Web容器**5. **第三方组件集成到Spring IOC容器中的配置项维护** Spring Boot的简化与自动化1. Spring Boot Starter启动依赖2. 自动装配机制3.…

vue和小程序的异同之处

Vue和小程序&#xff08;微信小程序&#xff09;是两种不同的前端开发框架&#xff0c;它们有一些相似之处&#xff0c;但也有一些主要的区别。 相似之处&#xff1a; 都是用于构建前端应用程序的框架。都支持组件化开发&#xff0c;将页面拆分成独立的组件进行开发和复用。都…

【狂神说Java】Dubbo + Zookeeper

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

【海德教育】什么是函授教育呢?

函授教育&#xff08;correspondence education &#xff09;是运用通信方式进行的一种远距离教育活动。学员以自学函授教材为主&#xff0c;面授为辅。教学环节包括自学教材&#xff0c;面授辅导&#xff0c;通信答疑&#xff0c;集中实验、实习、讲评作业&#xff0c;阶段测验…

跨域:利用JSONP、WebSocket实现跨域访问

跨域基础知识点&#xff1a;跨域知识点 iframe实现跨域的四种方式&#xff1a;http://t.csdnimg.cn/emgFr 注&#xff1a;本篇中使用到的虚拟主机也是上面iframe中配置的 目录 JSONP跨域 JSONP介绍 跨域实验&#xff1a; WebSocket跨域 websocket介绍 跨域实验 JSONP跨域…

javaSE学习笔记(五)集合框架-Collection,List,Set,Map,HashMap,Hashtable,ConcurrentHashMap

目录 四、集合框架 1.集合概述 集合的作用 集合和数组的区别 集合继承体系 数组和链表 数组集合 链表集合 2.Collection 方法 集合遍历 并发修改异常 3.List List集合的特有功能&#xff08;核心是索引&#xff09; 集合遍历 并发修改异常产生解决方案ListIterato…

PowerPoint to HTML5 SDK Crack

Convert PowerPoint to HTML5 Retaining Animations, Transitions, Hyperlinks, Smartart, Triggers and other multimedia effects World’s first and industry best technology for building web/mobile based interactive presentations directly from PowerPoint – that …

在Win11中使用docker安装Oracle19c

在Win11中使用docker安装Oracle19c 首先是去docker官网下 docker for windows安装oracle19c首先下载image运行镜像在工具中登录可能遇到的问题 首先是去docker官网下 docker for windows 官网&#xff1a; https://www.docker.com/get-started/ 如果Windows是专业版&#xff0…

HTML跳转锚点

跳转锚点适用于本页面和其他页面的任意标签的跳转以及JavaScript的运行 使用方法即给标签加上独一无二的id属性&#xff0c;再使用a标签跳转 如果是其他页面的标签只需加上其他页面的路径&#xff0c;eg.href"其他页面的路径#zp1" id属性的最好不要使用数字开头 <…

JVM在线分析-监控工具(jps, jstat, jstatd)

参考官方文档&#xff08;jdk11&#xff09; https://docs.oracle.com/en/java/javase/11/tools/troubleshooting-tools-and-commands.html#GUID-CB44BFBA-E5F9-4D80-8EE8-28E9F16BC451 1. 监控工具(jps, jstat, jstatd) jps -q Suppresses the output of the class name, J…

【六袆 - Framework】Angular-framework;前端框架Angular发展的由来0001;

Angular发展介绍&#xff0c;Angular17新特性 官方文档Angular框架发展的由来何为结构化、模块化 Angular17新特性 English unit Embarking on the journey of deep technical learning requires a well-structured approach, applicable to any programming language. The key…

python---设计模式

python中设计模式-单例模式 基于__new__方法实现 第一个设计&#xff1a; class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):passmysingleton1 MySingleton() mysingleton2 MySingleton() print(mysingleton1) print(mysingleton2) print(id(…

第 117 场 LeetCode 双周赛题解

A 给小朋友们分糖果 I 动态规划&#xff1a;设 p [ k ] [ i ] p[k][i] p[k][i] 为将 i i i 个糖果分给 k k k 个小朋友的方案数&#xff0c;先求 p [ 2 ] [ i ] p[2][i] p[2][i] &#xff0c;再求 p [ 3 ] [ n ] p[3][n] p[3][n] class Solution { public:using ll long …