「优选算法刷题」:矩阵区域和

一、题目

给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和: 

  • i - k <= r <= i + k,
  • j - k <= c <= j + k 且
  • (r, c) 在矩阵内。

示例 1:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]

示例 2:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]

二、思路解析

这道题的第一个考点就是得会读题,老实说,我读得也一知半解的,最终看了题解才做出来。

但大概意思就是,当 k = 1时,mat等于周围 1 个元素及其本身的总和,如下图:

图一

k 等于其它值时同理,扩大绿色部分即可。

这类题属于二维前缀和的,我们先用动态规划计算出一个辅助数组 dp,其中 dp[i][j] 表示矩阵 mat 中 (1,1) 到 (i,j) 区域内元素的和。

辅助数组 dp 中元素的推导公式如下:

图二

返回数组 answer 的推导公式如下:

图三

公式都是前缀和的基础知识,通过画图很快就能推出来,在此不做赘述。

同时,由于边界元素在计算时,有可能会超出 answer 数组的边界,所以我们要通过 max 和 min 来防止越界情况的发生,具体请下图:

图四

还有最后一步我们要弄明白的,就是下标的映射关系。我们通过动态规划中学到,在dp数组的维度上多加一行和一列,可以有效地减少我们对边界情况的计算量,也就如下图所示:

图五

而经过了这一步操作,图二图四都要在在图中加上绿色部分的代码。

具体实现请看下面代码👇

三、完整代码

class Solution {public int[][] matrixBlockSum(int[][] mat, int k) {int m = mat.length;int n = mat[0].length;int[][] dp = new int[m + 1][n + 1];for(int i = 1 ; i <= m ; i ++){for(int j = 1 ; j <= n ; j ++){dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];}}int[][] answer = new int[m][n];for(int i = 0 ; i < m ; i++){for(int j = 0 ; j < n ; j ++){int x1 = Math.max(0 , i - k) + 1;int y1 = Math.max(0 , j - k) + 1;int x2 = Math.min(m - 1 , i + k) + 1;int y2 = Math.min(n - 1 , j + k) + 1;answer[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];}}        return answer;}
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

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

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

相关文章

Java 1.8 docker 镜像制作

文章目录 一、下载文件二、精简JRE三、Dockerfile四、构建镜像五、容器测试 一、下载文件 glibc 下载地址 glibc-2.35-r1.apk glibc-bin-2.35-r1.apk glibc-i18n-2.35-r1.apk rsa sgerrand.rsa.pub jre 1.8 jre-8u201-linux-x64.tar.gz 二、精简JRE 解压 tar -zxvf jre-8…

动态住宅IP vs 静态住宅IP,如何选择适合你的海外住宅IP?

随着数字时代的发展&#xff0c;网络已经成为了我们日常生活中不可或缺的一部分。在海外留学、旅游、工作或者进行电子商务等活动时&#xff0c;一个合适的住宅IP可以帮助我们保护个人隐私、确保网络连接的稳定性、提高在线服务的可靠性等。因此&#xff0c;选择适合自己的住宅…

SpringCloudGateway获取报文大小

Overview SpringCloud Gateway使用过程中&#xff0c;希望获取报文大小。由于SpringCloud Gateway底层基于Netty实现&#xff0c;直接读取报文&#xff0c;会大幅影响网关性能。因此本文将通过其他方式获取报文大小。本文基于2.2.9 SpringCloud Gateway开发。 读取请求报文大…

读《Shape-Guided: Shape-Guided Dual-Memory Learning for 3D Anomaly Detection》

Chu Y M, Chieh L, Hsieh T I, et al. Shape-Guided Dual-Memory Learning for 3D Anomaly Detection[J]. 2023.&#xff08;为毛paperwithcode上面曾经的榜一引用却只有1&#xff09; 摘要 专家学习 无监督 第一个专家&#xff1a;局部几何&#xff0c;距离建模 第二个专家&…

CSS3技巧37:JS+CSS3 制作旋转图片墙

开学了就好忙啊&#xff0c;Three.js 学习的进度很慢。。。 备课备课才是王道。 更一篇 JS CSS3 的内容&#xff0c;做一个图片墙。 其核心要点是把图片摆成这个样子&#xff1a; 看上去这个布局很复杂&#xff0c;其实很简单。其思路是&#xff1a; 所有图片放在一个 div.…

【堆】【优先级队列】Leetcode 215. 数组中的第K个最大元素

【堆】【优先级队列】Leetcode 215. 数组中的第K个最大元素 PriorityQueue操作解法 优先级队列构造堆 小顶堆 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- PriorityQueue操作 创建优先级队列【默认创建小顶堆】&#xf…

elasticsearch 聚合DSL语法

1.聚合的分类 聚合可以实现对文档数据的统计、分析、运算。聚合常见的分类&#xff1a; • 桶(Bucket)聚合&#xff1a;用来对文档进行分组&#xff0c;比如 TermAggregation:按照文档字段值分组&#xff1b; Date HIstogram:按照日期阶梯分组&#xff0c;例如一周为一组&…

GIS之深度学习02:Anaconda2019版本安装(py38)

Anaconda是一个专注于数据科学和机器学习的开源发行版&#xff0c;内置了丰富的工具和库&#xff0c;包括Python解释器、NumPy、SciPy、Pandas、Scikit-learn、TensorFlow等&#xff0c;使用户能够轻松进行科学计算和数据分析。其强大的包管理器conda简化了软件包的安装和环境管…

Flask入门一

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…

【自动化的讲解】

自动化 1. 前言2. 自动化的历史和发展3. 自动化的类型4. 自动化的优点和缺点5. 自动化的实际应用 1. 前言 自动化是指使用各种控制系统和技术&#xff0c;如计算机软件、机器人、人工智能和信息技术来减少人工介入&#xff0c;并执行各种过程和任务&#xff0c;自动化可以应用…

Mysql的备份还原

模拟环境准备 创建一个名为school的数据库&#xff0c;创建一个名为Stuent的学生信息表 mysql> create database school; Query OK, 1 row affected (0.00 sec)mysql> use school; Database changed mysql> CREATE TABLE Student (-> Sno int(10) NOT NULL COMME…

java 数据结构栈和队列

目录 栈(Stack) 栈的使用 栈的模拟实现 栈的应用场景 队列(Queue) 队列的使用 队列模拟实现 循环队列 双端队列 用队列实现栈 用栈实现队列 栈(Stack) 什么是栈&#xff1f; 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操…

C 语言中的 char 关键字详解

1. char类型 char类型用于存储单个字符&#xff0c;占用1个字节的内存空间。在C语言中&#xff0c;char类型可以用于存储ASCII码表中的任意字符&#xff0c;包括大小写字母、数字、标点符号等。例如&#xff1a; char ch A;在这个例子中&#xff0c;变量ch存储了字符A的ASCI…

顶顶通呼叫中心中间件-如何使处于机器人话术中的通话手动转接到坐席分机上讲解(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件使用httpapi实现电话转接操作过程讲解(mod_cti基于FreeSWITCH) 需要了解呼叫中心中间件可以点以下链接了解顶顶通小孙 1、使用httpapi接口转接 一、打开web版的ccadmin并且找到接口测试 打开web-ccadmin并且登录&#xff0c;登录完成之后点击运维调试-再…

服务器部署java 的docker项目,以及常用的一些命令

1.编写Dockerfile文件&#xff08;javaEE&#xff09; # 使用 Java 运行时环境作为基础镜像 FROM openjdk:8-jdk-alpine# 将 jar 文件添加到容器中 ADD target/SBoot-ssmp-0.0.1-SNAPSHOT.jar app.jar# 运行 jar 文件 ENTRYPOINT ["java","-jar","/a…

【ArcGIS】统计格网中不同土地利用类型占比

基于ArcGIS统计格网中不同土地利用类型占比 数据准备ArcGIS操作步骤1、创建渔网&#xff08;Create Fishnet&#xff09;2、建立唯一标识3、选择格网4、提取不同类别土地利用类型5、各类用地面积计算 参考另&#xff1a;可能出现的问题总结Q1&#xff1a;ArcGIS获取唯一值&…

【python、nlp、transformer】transformer与nlp感受器

Transformer的优势 相比之前占领市场的LSTM和GRU模型&#xff0c;Transformer有两个显著的优势&#xff1a; 1. Transformer能够利用分布式GPU进行并行训练&#xff0c;提升模型训练效率。 2. 在分析预测更长的文本时&#xff0c;捕捉间隔较长的语义关联效果更好&#xff0e…

ARM系列 -- 虚拟化(一)

今天来研究一个有意思的话题&#xff0c;虚拟化&#xff08;virtualization&#xff09;。 开始前&#xff0c;先闲扯一下&#xff0c;最近一个词比较火&#xff0c;“元宇宙&#xff08;Metaverse&#xff09;”。在维基百科里面是这么定义元宇宙的&#xff0c;“The Metaver…

2024-02-27(Kafka)

1.Kafka中所有的消息都是保存在主题中的&#xff0c;要生产消息到Kafka&#xff0c;首先必须要创建一个主题。 2.Kafka的生产者/消费者 安装kafka集群&#xff0c;可以测试如下&#xff1a; 创建一个topic主题&#xff08;消息都是存放在topic中&#xff0c;类似mysql建表的过…

iMazing 3.0.0.3 for mac 中文破解版2024最新图文安装教程

我们刚刚发布了iMazing 3.0.0.3 for mac 中文版本。Windows和macOS用户现在都可以试驾并体验iPhone管理的未来。 备受期待的第一个Windows版本得益于过去几个月macOS测试版的所有改进&#xff0c;使其成为一个稳定的初始版本。 我们的开发团队创造了一种无缝的外观和体验&#…