【LeetCode每日一题】——304.二维区域和检索-矩阵不可变

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 矩阵

二【题目难度】

  • 中等

三【题目编号】

  • 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) 所描述的子矩阵的元素总和。

五【题目示例】

  • 示例 1:
    • 在这里插入图片描述
    • 输入:
      • [“NumMatrix”,“sumRegion”,“sumRegion”,“sumRegion”]
      • [[[[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]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
    • 输出:
      • [null, 8, 11, 12]
    • 解释:
      • NumMatrix numMatrix = new NumMatrix([[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]]);
      • numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
      • numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
      • numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)

六【题目提示】

  • m = = m a t r i x . l e n g t h m == matrix.length m==matrix.length
  • n = = m a t r i x [ i ] . l e n g t h n == matrix[i].length n==matrix[i].length
  • 1 < = m , n < = 200 1 <= m, n <= 200 1<=m,n<=200
  • − 1 0 5 < = m a t r i x [ i ] [ j ] < = 1 0 5 -10^5 <= matrix[i][j] <= 10^5 105<=matrix[i][j]<=105
  • 0 < = r o w 1 < = r o w 2 < m 0 <= row1 <= row2 < m 0<=row1<=row2<m
  • 0 < = c o l 1 < = c o l 2 < n 0 <= col1 <= col2 < n 0<=col1<=col2<n
  • 最多调用 1 0 4 次 s u m R e g i o n 方法 最多调用 10^4 次 sumRegion 方法 最多调用104sumRegion方法

七【解题思路】

  • 利用前缀和的思想
  • 新建一个二维数组,这个二维数组比原来的二维数组多一列,因为二维数组的每个位置都存储了之前元素的和,故多添加的一列就存储了原来二维数组最后一列的元素及之前值的和,我们只需要按照这个规律遍历填充这个新的二维数组即可
  • 对于传入的二维区域,我们只需要逐行的利用前缀和进行计算求和
  • 最后返回结果即可

八【时间频度】

  • 时间复杂度: O ( m n ) O(mn) O(mn) m 、 n m、n mn分别为传入的二维数组的行数和列数
  • 空间复杂度: O ( m n ) O(mn) O(mn) m 、 n m、n mn分别为传入的二维数组的行数和列数

九【代码实现】

  1. Java语言版
class NumMatrix {int[][] sums;public NumMatrix(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;sums = new int[m][n+1];for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){sums[i][j + 1] = sums[i][j] + matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {int res = 0;for(int i = row1;i <= row2;i++){res += sums[i][col2 + 1] - sums[i][col1];}return res;}}
  1. C语言版
typedef struct 
{int** sums;int sumsSize;
} NumMatrix;NumMatrix* numMatrixCreate(int** matrix, int matrixSize, int* matrixColSize) 
{int m = matrixSize;int n = matrixColSize[0];NumMatrix* obj = (NumMatrix*)malloc(sizeof(NumMatrix));obj->sums = (int**)malloc(sizeof(int*) * m);obj->sumsSize = m;for(int i = 0;i < m;i++){obj->sums[i] = (int*)malloc(sizeof(int) * (n + 1));}for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){obj->sums[i][j + 1] = obj->sums[i][j] + matrix[i][j];}}return obj;
}int numMatrixSumRegion(NumMatrix* obj, int row1, int col1, int row2, int col2) 
{int res = 0;for(int i = row1;i <= row2;i++){res += obj->sums[i][col2 + 1] - obj->sums[i][col1];}return res;
}void numMatrixFree(NumMatrix* obj) 
{for(int i = 0;i < obj->sumsSize;i++){free(obj->sums[i]);}free(obj);
}
  1. Python语言版
class NumMatrix:def __init__(self, matrix: List[List[int]]):m = len(matrix)n = len(matrix[0])self.sums = [[0] * (n + 1) for _ in range(m)]for i in range(0, m):for j in range(0, n):self.sums[i][j + 1] = self.sums[i][j] + matrix[i][j]def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:res = 0for i in range(row1, row2 + 1):res += self.sums[i][col2 + 1] - self.sums[i][col1]return res
  1. C++语言版
class NumMatrix {
public:vector<vector<int>> sums;NumMatrix(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();sums.resize(m, vector<int>(n + 1));for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){sums[i][j + 1] = sums[i][j] + matrix[i][j];}}}int sumRegion(int row1, int col1, int row2, int col2) {int res = 0;for(int i = row1;i <= row2;i++){res += sums[i][col2 + 1] - sums[i][col1];}return res;}
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

  4. C++语言版
    在这里插入图片描述

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

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

相关文章

JS进阶-Day3

&#x1f954;&#xff1a;永远做自己的聚光灯 JS进阶-Day1——点击此处&#xff08;作用域、函数、解构赋值等&#xff09; JS进阶-Day2——点击此处&#xff08;深入对象之构造函数、实例成员、静态成员等&#xff1b;内置构造函数之引用类型、包装类型等&#xff09; 更多JS…

【C++】—— 多态常见的笔试和面试问题

序言&#xff1a; 在上期&#xff0c;我们对多态进行了详细的讲解。本期&#xff0c;我给大家带来的是关于有关多态常见的笔试和面试问题&#xff0c;帮助大家理解记忆相关知识点。 目录 &#xff08;一&#xff09;概念查考 &#xff08;二&#xff09;问答题 1、简述一下…

C数据结构与算法——哈希表/散列表创建过程中的冲突与聚集(哈希查找) 应用

实验任务 (1) 掌握散列算法&#xff08;散列函数、散列存储、散列查找&#xff09;的实现&#xff1b; (2) 掌握常用的冲突解决方法。 实验内容 (1) 选散列函数 H(key) key % p&#xff0c;取散列表长 m 为 10000&#xff0c;p 取小于 m 的最大素数&#xff1b; (2) 测试 α…

阿里云安全组设置

简介​ 云主机安全组必须打开如下端口&#xff1a; ssh&#xff1a;22http&#xff1a;80https&#xff1a;443ftp&#xff1a;21、20000&#xff5e;30000 阿里云安全组端口开放教程​ 腾讯云安全组端口开放教程​ 华为云安全组端口开放教程​

C 语言高级2-多维数组,结构体,递归操作

1. 多维数组 1.1 一维数组 元素类型角度&#xff1a;数组是相同类型的变量的有序集合内存角度&#xff1a;连续的一大片内存空间 在讨论多维数组之前&#xff0c;我们还需要学习很多关于一维数组的知识。首先让我们学习一个概念。 1.1.1 数组名 考虑下面这些声明&#xff1…

华为云低代码平台Astro Canvas 搭建汽车展示大屏——实验指导手册

实验背景 大屏应用Astro Canvas是华为云低代码平台Astro的子服务之一&#xff0c;是以数据可视化为核心&#xff0c;以屏幕轻松编排&#xff0c;多屏适配可视为基础&#xff0c;用户可通过图形化界面轻松搭建专业水准的数据可视化大屏。例如汽车展示大屏、监控大屏、项目开发大…

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述&#xff1a; 二、案例实验&#xff1a; 1、-P选项&#xff0c;随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port&#xff0c;任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…

从零开始理解Linux中断架构(24)软中断核心函数__do_softirq

1)概要 __do_softirq函数处理是总是尽可能的执行所有未决软中断。 (1)关闭软中断:在preempt_count设置软中断标志:SOFTIRQ_OFFSET 让in_interrupt检查条件为真,进入软中断处理临界区,后面进来的处理请求,需要检查in_interrupt(),从而达到禁止本cpu上的软中断嵌套的目…

【C语言进阶】指针的高级应用(上)

本专栏介绍&#xff1a;免费专栏&#xff0c;并且会持续更新C语言知识&#xff0c;欢迎各位订阅关注。 关注我&#xff0c;带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章&#xff0c;坚持更新&#xff01; 大家的支持才是更新的最强动力&#xff01; 文章目录 一、…

【Spring框架】Spring AOP

目录 什么是AOP&#xff1f;AOP组成Spring AOP 实现步骤Spring AOP实现原理JDK Proxy VS CGLIB 什么是AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理。⽐如…

林大数据结构【2019】

关键字&#xff1a; 哈夫曼树权值最小、哈夫曼编码、邻接矩阵时间复杂度、二叉树后序遍历、二叉排序树最差时间复杂度、非连通无向图顶点数&#xff08;完全图&#xff09;、带双亲的孩子链表、平衡二叉树调整、AOE网关键路径 一、判断 二、单选 三、填空 四、应用题

Flutter运行app时向logcat输出当前打开的界面路径且点击可跳转

当一个项目大了目录文件多了&#xff0c;我们往往会为了找到一个文件花费大量的时间和精力&#xff0c;为了快捷方便的调试我们的项目&#xff0c;我们往往需要在打开app运行的时候需要知道当前打开的界面的文件在哪儿&#xff0c;我们这个代码就能快捷的知道我们app正在打开的…

MySQL存储过程(二十四)

你相信吗&#xff0c; 相信那一天的夕阳吗? 上一章简单介绍了 MySQL的索引(二十三),如果没有看过,请观看上一章 一. 存储过程 MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起&#xff0c; 应用程序无须关注存储过程和函数内部复杂的S…

浪潮服务器硬盘指示灯显示黄色的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 宁夏某市某单位的一台浪潮服务器&#xff0c;该服务器中有一组由6块SAS硬盘组建的RAID5阵列。 服务器上存放的是Oracle数据库文件&#xff0c;操作系统层面划分了1个卷。 服务器故障&初检&#xff1a; 服务器在运行过程中有两块磁盘的指示灯…

一个3年Android的找工作记录

作者&#xff1a;Petterp 这是我最近 1个月 的找工作记录&#xff0c;希望这些经历对你会有所帮助。 有时机会就像一阵风&#xff0c;如果没有握住&#xff0c;那下一阵风什么时候吹来&#xff0c;往往是个运气问题。 写在开始 先说背景: 自考本&#xff0c;3年经验&#xff0…

掌握 JVM 的参数及配置

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它负责执行Java程序&#xff0c;并提供一系列参数和配置选项&#xff0c;可以调整Java程…

JVM | 从类加载到JVM内存结构

引言 我在上篇文章&#xff1a;JVM | 基于类加载的一次完全实践 中为你讲解如何请“建筑工人”来做一些定制化的工作。但是&#xff0c;大型的Java应用程序时&#xff0c;材料&#xff08;类&#xff09;何止数万&#xff0c;我们直接堆放在工地上&#xff08;JVM&#xff09;…

AI Chat 设计模式:12. 享元模式

本文是该系列的第十二篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下享元模式A.1Q.2 也就是说&#xff0c;其实共享的是对象的内部状态&…

TCP的三次握手四次挥手

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥手&a…

【数据结构】快速排序

快速排序是一种高效的排序算法&#xff0c;其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决&#xff0c;最后将这些解合并得到最终结果。 快速排序的主要思路如下&#xff1a; 选择一个基准元素&#xff1a;从待排序的数组中选择一个元素作为基准&#xff08;…