【优选算法 前缀和】前缀和算法模板详解:一维前缀 & 与二维前缀和

news2024/12/25 10:20:11

      

 


一维前缀和


    题目解析   


 


    算法原理    



     解法一:暴力解法    


简单模拟,读完题意有 q 次询问,给哪两个数,就求哪段区间的和并且返回,这样的做法,时间复杂度为O(N*q),这个时间复杂度会超时;


     解法二:前缀和     


 前缀和算法的应用场景,就是快速求出数组中某一个连续区间的和

暴力解法需要从头到尾遍历一次数组,时间复杂度为O(N),而前缀和可以在连续区间以一个O(1)的时间复杂度求和;所以有q次求和,总的时间复杂度为O(q);


    (1) 预处理出一个前缀和数组    


预处理出来的前缀和数组,我们命名为 dp ;

并且与原始数组 arr 相同大小,比如 arr 的下标是从1到9,那么 dp 的下标也是从 1 到 9:


dp 的每一个元素 dp[i],表示 [ 1 , i ] 区间内所有元素的和:

小技巧:dp[ i +1] = dp[ i ] + arr [ i ]


    (2) 使用前缀和数组    


有了前缀和数组,如果要求 [ l , r ] 区间的和,只需要求 dp[ r ] - dp [ l -1 ] 即可;

 而使用前缀和数组来对一段连续区间进行求和,时间复杂度为 O(1),如果有 q 次求和,总的时间复杂度为 O(N) + O(q)


 我们可以把同一类问题,抽象成一个状态表示;


     (3) 处理细节问题     


为什么下标要从 1 开始计数呢?如果从 0 开始计数,当有一次要查询 [ 0 , 2 ] 区间的和:

带入这条公式,就变成了 dp[2] - dp[ -1],数组无法访问 -1 位置的元素,所以出现这种情况需要特殊处理;

而数组从 1 下标位置开始计数,查询 [ 1 , 3] 区间的和,就变成了 dp[3] - dp[ 0 ] ,我们只需要把 dp [0] 置为 0即可,避免处理边界情况; 

在动态规划中 ,把 dp[0]置为0,就是添加辅助节点的步骤,添加辅助节点来帮助初始化,能够避免处理一些边界情况;


    编写代码    




二维前缀和


  

    题目解析   



    算法原理    


     解法一:暴力解法    


 通过给出的坐标,直接求出子矩阵所有元素之和即可;时间复杂度,每次询问,最差情况是都得求出子矩阵中每个元素之和,就得遍历整个矩阵一遍,时间复杂度为O(n*m*q);


     解法二:前缀和     


    (1) 预处理出一个前缀和矩阵    


重新创建一个同等规模的矩阵 dp,dp[i][j] 表示从 [1,1] 到 [ i , j ] 里所有元素之和 ;

我们需要快速找出规律,来求出 dp[i][j] 的值是多少,否则每求一个元素,就要遍历一次用来的矩阵,那么创建 dp 表的时间复杂度也会很大;


我们可以根据所求的  dp[i][j],将原来的 A 矩阵分成四个部分,最终要求的 dp[i][j] 等于 A+B+C+D,可以类比面积的求和过程;dp[ i-1][ j-1 ]=A,但是 B C 区域不好求:

我们可以转换思路,求AB,AC再减去重复计算的部分,即可求出 B,C区域;并且,我们总结出了求 dp[i][j] 的公式: 

通过公式,就可以用公式以O(1) 的时间复杂度,来预处理前缀和矩阵;


    (2) 使用前缀和矩阵    


创建好前缀和矩阵后,该怎么使用呢?我们通过分割 :


转换成公式如下:

当得到递推公式,每次拿到 [x1 , y1] ~ [ x2 , y2 ],直接套用这条公式,就可以以 O(1) 的时间复杂度来求和两个坐标围成的子矩阵;


对比暴力解法,使用前缀和矩阵的时间复杂度为 ,在预处理前缀和数组的时间复杂度为 O(m*n),再查询 q 次求和结果,时间复杂度 O(q);得到的总时间复杂度 O( m*n + q )


    编写代码     


 



      

 

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

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

相关文章

yarn : 无法加载文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁

关于执行安装yarn命令后执行yarn -v报错: 先确认执行安装yarn命令是否有误 # 安装yarn npm install yarn -g 终端输入set-ExecutionPolicy RemoteSigned 当然如果yarn -v仍然执行失败,考虑使用管理员方式运行IDEA, 注:如上操作…

设计模式——单例模式和工厂模式

单例模式:一个类只创建一个类对象(节省内存减少类对象数量,一个类对象多次重复使用) 格式: class a: pass ba() z1b z2b #z1和z2为同一个类对象 工厂模式:(大批量创建具体的类对象,统一类对象入口便于维护&#xf…

UVM之寄存器模型生成

1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 (1)首先通过openpyxl读取EXCEL表格, workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 (2&#xff…

web 期末作业简单设计网页——“我的家乡”网站简单设计

1、网页效果 首页 七彩云南页 旅游攻略页 用户页面 2、源代码 首页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><link rel"stylesheet" href"out.css&quo…

Nanolog起步笔记-10-log解压过程(4)寻找meta续2

Nanolog起步笔记-10-log解压过程4寻找meta续2 写在前面重新开始trace readDictionaryFragment读取meta头部读入每个记录createMicroCode读入头部&#xff0c;和文件名 切分format字符串PrintFragment 后记 写在前面 前面的工作&#xff0c;已做打下令人有信心的基础。 重新开…

编译问题 fatal error: rpc/rpc.h: No such file or directory

在编译一些第三方软件的时候&#xff0c;会经常遇到一些文件识别不到的问题&#xff0c;这里整理下做个归总。 目前可能的原因有&#xff08;排序分先后&#xff09;&#xff1a; 文件不存在&#xff1b;文件存在但路径识别不了&#xff1b;…… 这次以常见的编译lmbench测试…

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法&#xff0c;我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响&#xff0c;因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…

记录:ubuntu 使用chattts的过程。

你知道什么是穷人吗&#xff1f;穷人就是没钱还想学习。 git GitHub - 2noise/ChatTTS: A generative speech model for daily dialogue. 因为所以。cosyvoice&#xff0c;gpt-s . 0.先找一个目录吧。 1.命令行模式 duyichengduyicheng-computer:~/gitee$ git clone https:…

鸿蒙实现应用通知

目录&#xff1a; 1、应用通知的表现形式2、应用通知消息的实现1、发布普通文本类型通知2、发布进度类型通知3、更新通知4、移除通知 3、设置通知道通展示不同形式通知4、设置通知组5、为通知添加行为意图1、导入模块2、创建WantAgentInfo信息3、创建WantAgent对象4、构造Notif…

Redis篇-6--原理篇5--单线程模型

1、概述 Redis 采用单线程模型来处理客户端请求&#xff0c;这意味着在任意时刻只有一个命令被执行。这种设计简化了 Redis 的实现&#xff0c;并确保了高并发环境下的数据一致性。尽管 Redis 是单线程的&#xff0c;但它通过高效的内存管理和网络 I/O 操作&#xff0c;仍然能…

stm32 GPIO8种输入输出模式

1、分类&#xff1a; 2、输出详解 2.1 推挽输出、复用推挽输出 GPIO_Mode_Out_PP (Output Push-Pull)、GPIO_Mode_AF_PP (Alternate Function Push-Pull) 推挽模式下&#xff0c;内部供电&#xff0c;电路主要控制P-MOS、N-MOS通、断电流实现I/O高、低电平输出 -->应用&…

MongoDB 建模调优change stream实战

MongoDB开发规范 &#xff08;1&#xff09;命名原则。数据库、集合命名需要简单易懂&#xff0c;数据库名使用小写字符&#xff0c;集合名称使用统一命名风格&#xff0c;可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。 &#xff08;2&#xff09…

【漫话机器学习系列】003.Agglomerative聚类

Agglomerative 聚类&#xff08;层次聚类中的自底向上方法&#xff09; Agglomerative 聚类是一种层次聚类&#xff08;Hierarchical Clustering&#xff09;算法&#xff0c;采用自底向上的策略&#xff0c;将每个数据点看作一个单独的簇&#xff0c;然后逐步将相近的簇合并…

docker的网络类型和使用方式

docker的网络类型 5种网络类型 bridge 默认类型&#xff0c;桥接到宿主机docker0的网络&#xff0c;有点类似于VM虚拟机的NAT网络模型。 案例: docker run --rm -itd --network bridge --name wzy666wzy-bridge alpine host host类型&#xff0c;共享宿主机的网络空间&#…

Java版-图论-最小生成树-Prim算法

实现描述 如图&#xff1a; Prim算法的基本思想是从一个顶点开始&#xff0c;逐步构建最小生成树。具体步骤如下&#xff1a; 随机选取一个顶点作为起始点&#xff0c;并将其加入最小生成树的集合中。从该顶点出发&#xff0c;选择一条边连接到其他未被访问的顶点中的最小权…

ZooKeeper节点扩容

新节点的准备工作&#xff08;这里由hadoop05节点&#xff0c;IP地址为192.168.46.131充当&#xff09; 配置新节点的主机域名映射&#xff0c;并将其通告给集群中的其他节点配置主机间免密登录关闭防火墙并将其加入到开机不启动项同步hadoop01节点的时间将所需要的文件分发给新…

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…

厦门凯酷全科技有限公司抖音电商服务的卓越典范

在短视频和直播带货迅速崛起的时代&#xff0c;厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全科技”&#xff09;以其专业的服务、创新的精神以及对市场的深刻理解&#xff0c;在抖音电商领域中脱颖而出&#xff0c;成为众多品牌商家信赖的选择。本文将深入探讨凯酷全科…

电脑运行时提示“0x80240037”错误,提示安装ie插件或其他微软程序时,报错提示“未指定的错误”是什么原因?以及要怎么解决和预防?

电脑运行时0x80240037错误解析&#xff1a;未指定的错误在安装IE插件或微软程序中的原因、解决与预防 作为一名经验丰富的软件开发从业者&#xff0c;我深知电脑在日常使用中可能遇到的各种问题&#xff0c;尤其是安装或更新软件时出现的错误。今天&#xff0c;我们将聚焦于一…

【C++】输入三个整数,输出最大值的高级分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述&#x1f4af;解题思路&#x1f4af;实现与分析方法一&#xff1a;三元运算符的直接应用详细分析&#xff1a;优缺点剖析&#xff1a; 方法二&#xff1a;显式条件…