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

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


上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

示例:

给定 matrix = [
  [3, 0, 1, 4, 2],
  [5, 6, 3, 2, 1],
  [1, 2, 0, 1, 5],
  [4, 1, 0, 1, 7],
  [1, 0, 3, 0, 5]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12
说明:

你可以假设矩阵不可变。
会多次调用 sumRegion 方法。
你可以假设 row1 ≤ row2 且 col1 ≤ col2。

思路:

我们想求黑框框,应该黄框框+红框框-灰框框(红黄重合部分加了两次所以要减去)

请注意:

不要忘了判空。

class NumMatrix {int[][] temp;public NumMatrix(int[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) return;int lenA=matrix.length;int lenB=matrix[0].length;temp=new int[lenA][lenB];temp[0][0]=matrix[0][0];for(int i=1;i<lenA;i++){temp[i][0]=temp[i-1][0]+matrix[i][0];}for(int i=1;i<lenB;i++){temp[0][i]=temp[0][i-1]+matrix[0][i];}for(int i=1;i<lenA;i++){for(int j=1;j<lenB;j++){temp[i][j]=temp[i-1][j]+temp[i][j-1]-temp[i-1][j-1]+matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {int A=col1>0?temp[row2][col1-1]:0;int B=row1>0?temp[row1-1][col2]:0;int C=A==0 || B==0?0:temp[row1-1][col1-1];return temp[row2][col2]-A-B+C;}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

这个代码还不对,看求C的时候,我使用A和B区域是否等于零来判断是否是边界,其实是不对的(万一一堆数加起来真的等于零呢)

最终:

class NumMatrix {int[][] temp;public NumMatrix(int[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) return;int lenA=matrix.length;int lenB=matrix[0].length;temp=new int[lenA][lenB];temp[0][0]=matrix[0][0];for(int i=1;i<lenA;i++){temp[i][0]=temp[i-1][0]+matrix[i][0];}for(int i=1;i<lenB;i++){temp[0][i]=temp[0][i-1]+matrix[0][i];}for(int i=1;i<lenA;i++){for(int j=1;j<lenB;j++){temp[i][j]=temp[i-1][j]+temp[i][j-1]-temp[i-1][j-1]+matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {int A=col1>0?temp[row2][col1-1]:0;int B=row1>0?temp[row1-1][col2]:0;int C=col1==0 || row1==0?0:temp[row1-1][col1-1];return temp[row2][col2]-A-B+C;}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

官方:思路一样,在数组左边和上边加了一层,写起来方便很多,我给忘了可以这么写了。

又被官方虐了55555

private int[][] dp;public NumMatrix(int[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) return;dp = new int[matrix.length + 1][matrix[0].length + 1];for (int r = 0; r < matrix.length; r++) {for (int c = 0; c < matrix[0].length; c++) {dp[r + 1][c + 1] = dp[r + 1][c] + dp[r][c + 1] + matrix[r][c] - dp[r][c];}}
}public int sumRegion(int row1, int col1, int row2, int col2) {return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
}

 

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

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

相关文章

(九)nodejs循序渐进-Express框架(进阶篇)

Express 框架 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用&#xff0c;和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 Express 框架核心特性&#xff1a; 可以设置中间件来响应 HTTP 请求。 定…

leetcode326. 3的幂 如此6的操作你想到了吗

给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输入: 45 输出: false 进阶&#xff1a; 你能不使用循环或者递归来完成本题吗&#xff1f; 注意最后一句…

(十)nodejs循序渐进-高性能游戏服务器框架pomelo之介绍和安装篇

目录 Pomelo 安装Pomelo 创建demoserver项目 pomelo命令 项目结构说明 pomelo框架 架构 服务器实现 客户端请求与响应、广播的抽象介绍 Pomelo pomelo是一个快速、可扩展、Node.js分布式游戏服务器框架&#xff0c;对游戏服务器开发感兴趣的同学可以关注关注。 之前…

leetcode344. 反转字符串 史上最简单力扣题

编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。…

(十一)nodejs循序渐进-高性能游戏服务器框架pomelo之启动流程和组件

游戏启动过程 启动入口 在使用pomelo进行游戏开发时&#xff0c;工程目录下的app.js是整个游戏服务器的启动运行入口。app.js中创建项目&#xff0c;进行默认配置并启动服务器的代码如下&#xff1a; var pomelo require(pomelo); var app pomelo.createApp(); app.set(na…

(十二)nodejs循序渐进-高性能游戏服务器框架pomelo之创建一个游戏聊天服务器

上个章节我们简单介绍了下pomelo的安装和目录结构&#xff0c;有读者可能觉得有点吃不消&#xff0c;为什么不再深入讲一讲目录结构和里边的库&#xff0c;这里我就不费口舌了&#xff0c;大家可以去官网参考文档说明&#xff0c;本文只告诉大家如何利用这个框架来开发自己的东…

看这玩意复习你还会挂科?《软件工程篇》

软件工程&#xff1a;是指导软件开发和维护的一门工程学科 三要素方法/工具/开发过程 价值&#xff1a;促进项目成功 现代产品开发三原则&#xff1a;功用性、可行性、称许性 软件过程是软件工程的核心组成部分。 迭代 &#xff1a;反复求精 增量&#xff1a;逐块建造 需…

C++:02---命名空间

一、概念: ①类似于仓库,空间内存储代码,需要用到时调用②也为防止名字冲突提供了更加可控的机制二、命名空间的定义 定义的基本格式如下:namespace 命名空间名 { //一系列声明与定义 };三、命名空间的注意事项 命名空间定义时最后的分号可有可无只要出现在全局作用域中的…

看这玩意复习你还会挂科?《软件工程2篇》

第一章&#xff1a; 软件工程定义&#xff1a; 1968年10月&#xff0c;Fritz Bauer 首次提出了“软件工程”的概念&#xff0c;并将“软件工程”定义为&#xff1a;为了经济地获得能够在实际机器上有效运行的可靠软件&#xff0c;而建立并使用的一系列工程化原则。 1993年IE…

C++:05---命名空间

一、概念: ①类似于仓库,空间内存储代码,需要用到时调用②也为防止名字冲突提供了更加可控的机制二、命名空间的定义 定义的基本格式如下:namespace 命名空间名 { //一系列声明与定义 };三、命名空间的注意事项 命名空间定义时最后的分号可有可无只要出现在全局作用域中的…

C++:04---内联函数

1.概念: 内联类似于宏定义,当程序执行到内联函数时,相当于复制了一份函数代码。牺牲代码空间,赢得了时间 内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求 2.关键字:inline 声明时写了inline,定义时可省略。建议声明和定义都加上inlineinline int add(int…

leetcode86. 分隔链表

给定一个链表和一个特定值 x&#xff0c;对链表进行分隔&#xff0c;使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head 1->4->3->2->5->2, x 3 输出: 1->2->2->4->3->5…

(十三)nodejs循序渐进-高性能游戏服务器框架pomelo之扩展聊天服务器为机器人自动聊天

聊天服务器扩展 大家在上一篇文章里相信已经学会了pomelo框架的基本用法了&#xff0c;那么我们在上一篇文章的代码基础上继续扩展&#xff0c;丰富系统&#xff0c;另外也熟悉下他的更多的用法&#xff0c;这一节我将扩展它&#xff1a;增加一个机器人自动聊天的功能。 目的…

C++:09---类静态成员、类常量成员

一、类静态成员(static) 先介绍一下什么是静态变量、静态函数 静态局部变量:存在域(全局数据区),作用域(块作用域)静态全局变量:存在域(全局数据区),作用域(整个文件)静态函数:存在域(全局数据区),作用域(整个文件)static int a=10;//全局静态变量 static vo…

C++:08---成员变量初始化方式

成员变量初始化有三种方式: 在构造函数体内赋值初始化在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化)在构造函数的成员初始化列表初始化一、构造函数体内初始化 说明:在构造函数体内的初始化方式,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要…

leetcode1290. 二进制链表转整数 刷新认知,最简单算法题

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进…

Redis:02---安装Redis(Linux+Windows+Docker)

Linux安装&#xff1a;一、安装方式1&#xff08;下载源码编译安装&#xff09;第一步&#xff1a;从下面的网址中下载Redis最新稳定版本的源代码sudo wget http://download.redis.io/redis-stable.tar.gz第二步&#xff1a;下载完之后解压&#xff0c;建立一个软链接指向于red…

C++:10---再议拷贝构造函数

一、概念 使用一个已经存在的对象,去构造(初始化)另一个对象二、格式 参数加上const&,因为拷贝构造函数在几种情况下都会被隐式地使用,因此拷贝构造函数不应该是explict的const:防止函数内部修改值&:防止无限循环拷贝类名(类名 const& 参数名) { 函数体 }三、…

人的思维谬误与心理学效应

启发法 用一个容易的问题代替难以回答的真正问题。这个容易的问题的答案就是对真正问题的启发&#xff0c;但启发经常和真正的答案差得很远&#xff0c;而人却往往把启发当成了真正问题的答案。 接下来介绍和启发法相关的心理效应和谬误。每一个谬误都会注明真正的问题是什么…

C++:07---this指针

一、this指针介绍 概念:this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针)特点:在成员函数中可通过this指针区别成员变量与形参变量this可以显式调用示例代码:class Cperson { private: int age; float height; public: void InitPerson(int age,flo…