当前位置: 首页 > news >正文

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

目录

    • 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数组, 在编码方面两个小难点:

相关文章:

  • 【Golang】go语言异常处理快速学习
  • PHP应用程序设计:一个实际的例子(3)
  • 【博资考2】网安学院-北航网安基础部分(简洁版)
  • zabbix“专家坐诊”第276期问答
  • 八、Spring Boot:RESTful API 应用
  • 【链 表】
  • matlab 海浪模型和舰艇动力学模型
  • 【后端】微服务架构
  • 【学习笔记】Cadence电子设计全流程(三)Capture CIS 原理图绘制(中)
  • 和Claude对战黑白棋!一起开发AI对弈游戏
  • Python开发 Flask框架面试题及参考答案
  • 循环神经网络rnn
  • 第二十:【路由的props配置】
  • 鸿蒙-canvas-刮刮乐
  • MySQL 序列
  • Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql
  • Python常见面试题的详解21
  • 动态自定义标签属性页面(Tomcat 9)
  • C++——模版(二)
  • 【Python爬虫(66)】解锁政府公开数据:Python爬虫实战攻略
  • 上海交大曾小勤:科技传播不应停留于知识搬运,要做科学思维的播种机
  • 专访|《内沙》导演杨弋枢:挽留终将失去的美好
  • 上百家单位展示AI+教育的实践与成果,上海教育博览会开幕
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?
  • 马上评|训斥打骂女儿致死,无暴力应是“管教”底线
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?