「算法」前缀和

news/发布时间2024/9/20 7:50:07

前缀和主要解决求数组中某段区间元素和的问题,使用前缀和解决问题的步骤如下:

  1. 预处理一个前缀和数组
  2. 使用这个数组

一维前缀和

现在有一个一维数组nums

  • 预处理前缀和数组
    定义一个数组 dp[]dp[i]表示 nums 中 [0,i-1] 区间的元素和,那我们就有 dp[i] == dp[i-1] + nums[i-1]这个递推关系
    然后就可以来初始化 dp 数组:
for(int i = 1;i <= len;i++) dp[i] = dp[i-1]+nums[i-1];

这里的 dp 数组我们从下标为1处开始放值,这是因为如果 i 为 0,那 i-1 就非法了,所以我们从1开始,这样就不用单独讨论 i 为 0 的情况(注意 dp 的长度应比 nums 多1,而且循环的范围是[1, len]

  • 使用前缀和数组
    接下来使用处理好的前缀和数组,用下面的模板题来演示一下:
    区域和检索——数组不可变

前缀和不难,主要是不同数组间下标的映射关系不好理解,比如题中要我们求 nums 的[left,right]的和,nums 的 left 对应到 dp 中的下标是 left + 1,right 对应 right + 1,所以这个区间的和就是dp[right+1]-dp[left],用文字解释就是 nums 的 0 到 right 的区间和减掉 0 到 left - 1 的 区间和
代码如下:

class NumArray {int[] dp;public NumArray(int[] nums) {int len = nums.length;dp = new int[len+1];for(int i = 1;i <= len;i++) dp[i] = dp[i-1]+nums[i-1];}public int sumRange(int left, int right) {return dp[right+1]-dp[left];}
}

二维前缀和

以一道模板题展开讲解:
二维区域和检索——矩阵不可变

与处理一维数组一样,在处理二维数组的时候,我们行和列都从下标为1处开始
要算[i,j]处的前缀和,我们通过下图的方式来计算
(这里直接贴力扣官方题解的图了,官方的图比较好看,不过官方的题解真的就是一坨…):
在这里插入图片描述
简单来说就是有个地方算重复了,这块地方就是黄色和蓝色重叠的绿色部分:f[i-1][j-1],需要把它减掉

此外还要注意下标的映射关系,因为前缀和数组多定义了一行一列,所以原数组matrix[i][j]的前缀和,应该放到前缀和数组arr[i+1][j+1]。比如对于arr中(3,3)处的元素,它其实对应的是matrix中的(2,2)
图示如下,其中绿色部分就是为了避免讨论边界情况而多定义的一行和一列,注意辨别两个数组中三角形的下标
在这里插入图片描述

构造二维前缀和数组的方法如下:

	public NumMatrix(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;arr = new int[m+1][n+1];for(int i = 1;i <= m;i++) {for(int j = 1;j <= n;j++) {arr[i][j] = arr[i][j-1] + arr[i-1][j] - arr[i-1][j-1] + matrix[i-1][j-1];}}}

构造完之后,接下来就要使用它

这道模板题要我们求原数组中(x1,y1)到(x2,y2)之间的区域的元素和,其实也就模仿刚才计算前缀和的方式进行计算:
在这里插入图片描述

注意 sumRegion 方法的参数,是原数组的下标,我们要根据映射关系转化为前缀和数组的下标,将四个坐标都加1就ok了

代码如下:

    public int sumRegion(int row1, int col1, int row2, int col2) {x1++; y1++; x2++; y2++;return arr[x2][y2] - arr[x2][y1-1] - arr[x1-1][y2] + arr[x1-1][y1-1];}

整道题的代码为:

class NumMatrix {int[][] arr;public NumMatrix(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;arr = new int[m+1][n+1];for(int i = 1;i <= m;i++) {for(int j = 1;j <= n;j++) {arr[i][j] = arr[i][j-1] + arr[i-1][j]+ matrix[i-1][j-1] - arr[i-1][j-1];}}}public int sumRegion(int x1, int y1, int x2, int y2) {x1++; y1++; x2++; y2++;return arr[x2][y2] - arr[x2][y1-1] - arr[x1-1][y2] + arr[x1-1][y1-1];}
}

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

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

相关文章

vulhub中JBoss 5.x/6.x 反序列化漏洞复现(CVE-2017-12149)

该漏洞为 Java反序列化错误类型&#xff0c;存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化&#xff0c;从而导致了漏洞。 漏洞复现 利用攻击进行漏洞利用yunxu1/jboss-_…

怎么把一段音频的人声和背景音乐分开?3种方法分享

怎么把一段音频的人声和背景音乐分开&#xff1f;随着技术的不断发展进步&#xff0c;将音频中的人声和背景音乐分离已成为现实。这种技术不仅提升了音频编辑的效率和准确性&#xff0c;更为我们提供了无限的可能性。例如&#xff0c;音乐制作人可以更容易地提取出纯净的人声或…

Android之UI Automator框架源码分析(第九篇:UiDevice获取UiAutomation对象的过程分析)

前言 学习UiDevice对象&#xff0c;就需要看它的构造方法&#xff0c;构造方法中有UiDevice对象持有一些对象&#xff0c;每个对象都是我们分析程序的重点&#xff0c;毕竟UiDevice对象的功能&#xff0c;依赖这些组合的对象 备注&#xff1a;当前对象持有的对象&#xff0c;初…

生成式AI设计模式:综合指南

原文地址&#xff1a;Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时&#xff0c;都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

latex报错:Undefined control sequence.解决办法

经过分析是缺宏包了&#xff0c;\usepackage{amsmath}。 总结 在 VS Code 中编写 LaTeX 文档时&#xff0c;如果你遇到了 “Undefined control sequence” 错误&#xff0c;这通常意味着你尝试使用的某个 LaTeX 命令或宏没有被定义。在 LaTeX 中&#xff0c;很多公式和符号需要…

vue导出excel文件时出现了两个同样表格的重复数据

vue导出excel文件时出现了两个同样表格的重复数据 先看我的效果&#xff0c;这里重复了两次数据 解决办法&#xff1a; 是因为表格中列中有fixed的属性&#xff0c; 把这个属性去掉&#xff0c;然后从新导出就ok了&#xff01;

MySQL基础(二)

文章目录 MySQL基础&#xff08;二&#xff09;1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

k8s1.23.15集群二进制部署

一、前言 二进制部署1.23.15版本k8s集群&#xff0c;etcd集群部署与k8s集群节点复用&#xff0c;手动颁发集群证书 主机信息如下 主机名称ip地址服务k8s-master0110.1.60.125docker、etcd、kube-apiserver、kube-schduler、kube-controller-manage、kubelet、kube-proxyk8s-no…

省市区街道/乡镇四级联动vue3

最近优化了一个省.市.区/县、乡镇/街道的四级联动组件&#xff0c;技术栈是element vue3记录一下。 本来是这样的三级联动&#xff1a; 这个三级联动很简单&#xff0c;直接利用el-select组件把地区值带进去就行了&#xff0c;现在要优化成省.市.区/县、乡镇/街道的四级联动&…

C# 多线程(3)——线程池

文章目录 1 定义2 线程池使用3 安全取消线程池中任务 1 定义 线程是计算机宝贵的资源&#xff0c;频繁的创建和销毁线程将会大量的占用计算机资源&#xff08;为每个线程单独分配内存空间&#xff0c;并且多线程下的CPU时间片的切换也会耗费一定的时间&#xff09;。为了充分利…

LabVIEW眼结膜微血管采集管理系统

LabVIEW眼结膜微血管采集管理系统 开发一套基于LabVIEW的全自动眼结膜微血管采集管理系统&#xff0c;以提高眼结膜微血管临床研究的效率。系统集成了自动化图像采集、图像质量优化和规范化数据管理等功能&#xff0c;有效缩短了图像采集时间&#xff0c;提高了图像质量&#…

Langchain-Chatchat:离线运行的大模型知识库 | 开源日报 No.182

chatchat-space/Langchain-Chatchat Stars: 22k License: Apache-2.0 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现的开源、可离线部署的检索增强生成 (RAG) 大模型知识库项目。该项目是一个可以实现完全本地化推理的知识库增强方案&#xff0c;重点解决数据安全保护…

Palworld 幻兽帕鲁面板开服教程

介绍 在本文档中&#xff0c;您将学习如何构建 Palworld 服务器。 关于 Palworld 通过设置服务器&#xff0c;您可以与您的 Palworld 好友以及其他玩 Palworld 的人共享同一个世界。 推荐的服务器设置 内存 由于至少一次内存泄漏&#xff0c;服务器需要大约 16-32GB RAM。…

FPGA之16:1复选器

每个slice 都有一个F8MUX。F8MUX原语&#xff1a; MUXF8 MUXF8_inst&#xff08; .0&#xff08;0&#xff09;&#xff0c;Il Output of MUX to general routing .I0&#xff08;10&#xff09;&#xff0c;//Input&#xff08;tie to MUXF7L/LO out&#xff09; .I1&#xf…

纽约纳斯达克大屏投放受众群体有哪些-大舍传媒

纽约纳斯达克大屏投放受众群体有哪些-大舍传媒 1. 纳斯达克大屏的概述 纳斯达克大屏是全球金融市场中最出名的电子交易平台之一。作为一个重要的金融信息传递渠道&#xff0c;纳斯达克大屏吸引了来自全球的投资者的目光。在这个巨大的投放平台上&#xff0c;大舍传媒希望为客…

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt&#xff08;官方发音 [kju:t]&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序 Qt 是纯 C 开发的&#xff0c;正常情况下需要先学习C语言、然后在学习C然后才能使用…

计算机设计大赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

【前端素材】推荐优质后台管理系统cassie平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

【JavaEE】_前端使用GET请求的queryString向后端传参

目录 1. GET请求的query string 2. 关于query string的urlencode 1. GET请求的query string 1. 在HttpServletRequest请求中&#xff0c;getParameter方法用于在服务器这边获取到请求中的参数&#xff0c;主要在query string中&#xff1b; query string中的键值对都是程序…

Docker容器(3)单容器管理

一、单容器 1.1概念简介 Docker三个重要概念: 仓库(Repository); 镜像(Image); 容器(Container). *Docker的三个重要概念是仓库(Repository)、镜像(Image)和容器(Container)**。具体如下&#xff1a; **镜像(Image)**&#xff1a;Docker镜像是创建容器的基础&#xff0c;它类似…
推荐文章