[算法--前缀和] 矩阵区域和

embedded/2025/2/28 1:49:22/

目录

    • 1. 二维前缀和的知识铺垫
    • 2. 以nums[i][j]为中心计算区域大小.
    • 3. dp数组与ret数组之间的逻辑关系.
    • 4. 细节: 如果[i,j]为中心的数组越界了呢?

下面继续分享一道用前缀和思想解决的算法问题 -> 矩阵区域和

1. 二维前缀和的知识铺垫

实际上, 有一道十分类似的基础题 -> 二维前缀和
因为比较简单, 下面就简单的说两个关键点:

  • 计算二位前缀和数组的公式推导: dp[i][j] = dp[i-1][j] + dp[i][j-1] + nums[i][j] - dp[i-1][j-1]
    在这里插入图片描述
      这个很简单, 实际上推导的是二维前缀和数组如何递推的, 在已知左边前缀和和上面前缀和前提下, 可以用橙色部分 + 蓝色部分 + 红色部分 - 橙色蓝色交叉的部分(这样也就决定了必须是从左向右推导, 从上到下推导的一个顺序).
  • 利用二位前缀和数组求指定区域和: ret = dp[x2, y2] - dp[x1-1, y2] - dp[x2, y1-1] + dp[x1-1][y1-1]
    在这里插入图片描述

  上面这个图说明了如何利用我们前面求好的二位前缀和数组来求任何一个特定矩形大小的所有元素之和. 具体就不说了, 黄色区域的元素之和 = 所有颜色之和(dp[x2, y2]) - 绿色区域 - 蓝色区域 + 绿色和蓝色区域重叠部分.

这其实就是[二位前缀和模板题]的解答关键. 当然, 仅仅这些是远远不够的, 这仅仅是这道题的铺垫.

2. 以nums[i][j]为中心计算区域大小.

我们这道题 -> 矩阵区域和实际上就是对上面做了一个简单的变形. 我们以示例1为例, 来简单说一下这个题目要求我们做啥?
在这里插入图片描述
在这里插入图片描述

  这样的话一种方法肯定就是暴力求解了, 以[i,j]为中心, 挨个遍历周围的元素然后相加给到ret数组中的元素, 显然效率很低.

为了提高效率, 我们借用二维前缀和来提高效率.

3. dp数组与ret数组之间的逻辑关系.

我们预处理出一个二位前缀和数组来.
然后如何将ret数组与dp数组建立关系呢? 请看下图:
在这里插入图片描述
但是, 还需要注意一个细节 -> 就是越界问题.

4. 细节: 如果[i,j]为中心的数组越界了呢?

上面标题说的啥意思呢? 就是类似于下面这种情况:
在这里插入图片描述
  因此, 我们在计算的时候要进行判断, 如果要访问的值越过了mat数组, 我们需要即使进行纠正!

  好了, 说完了上面还有一个小难点就是因为有三个数组, 一个mat数组, 一个dp数组, 还一个ret数组, 在编码方面两个小难点:


http://www.ppmy.cn/embedded/167687.html

相关文章

HTML篇

1. src和href的区别 (1)src src 是 source 的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求 src 资源时会将其指向的资源下载并应用到文档内,例如 js 脚本,img …

使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

在 Kubernetes 1.24及以上版本环境中,docker不再被支持,主要使用Containerd 是常用的容器运行。默认情况下,Containerd 使用 HTTPS 协议与镜像仓库通信。然而,在某些场景下(如测试环境或内部网络)&#xff…

TCP协议中TIME_WAIT状态的分析

在计算机网络中,TCP(传输控制协议)是一种重要的协议,它提供可靠的、面向连接的通信。TCP协议通过一个复杂的状态机管理连接的生命周期,其中 TIME_WAIT状态是其核心机制之一。理解 TIME_WAIT状态对于深入了解TCP协议的运…

C进阶 自定义类型

目录 前言 一 结构体 二 结构体的存储 三 位段 四 枚举 五 联合体 总结 前言 我们之前学习的int char double ......都是内置类型,但是我们今天所学习的是自定义类型,比如联合体,结构体,枚举 一 结构体 结构体是一…

信创终端上如何将PDF文件转为OFD文件

原文链接:信创终端上如何将PDF文件转为OFD文件 Hello,大家好啊!今天给大家带来一篇关于在信创终端上使用永中OFD板式软件、福昕OFD板式办公套件、点聚OFD板式软件、友虹OFD3.0将PDF转换为OFD文件的文章。在信创环境下,OFD作为国产…

VScode 开发

目录 安装 VS Code 创建一个 Python 代码文件 安装 VS Code VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器,VSCode 开发环境非常简单易用。 VSCode 安装也很简单,打开官网 Visual S…

Redis 缓存穿透、击穿、雪崩:问题与解决方案

在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决…

1分钟用DeepSeek编写一个PDF转Word软件

一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的pdf转word工具有收费的wps,免费的有pdfgear,见下文: PDFgear:一款免费的PDF编辑、格式转化软件-CSDN博客 还有网上在线的免费pdf转word工具smallp…