【算法 C/C++】一维前缀和
2025 - 03 - 08 - 第 68 篇
Author: 郑龙浩 / 仟濹
【一维前缀和】
文章目录
- 前缀和与差分 - 我的博客
- 1 大体介绍
- 2 计算某些区间的和( 不使用前缀和 )
- 3 计算某些区间的和( 使用前缀和 )
前缀和与差分 - 我的博客
一维前缀和
【算法 C/C++】一维前缀和
一维差分
【算法 C/C++】一维差分
二维前缀和
【算法 C/C++】二维前缀和
二维差分
【算法 C/C++】二维差分# 前缀和(一维)
时间复杂度为 O(1)
可以在O(1)的时间复杂度内获取任意子数组的和。
1 大体介绍
是一种用于计算区间和的问题的高效算法,尤其适用于静态数组(即数组在查询时是不会改变的)。它通过预先计算前缀和数组来快速响应区间和查询,时间复杂度为 O(1),空间复杂度为 O(n),适用于多次查询的场景。
2 计算某些区间的和( 不使用前缀和 )
题目
有一个数组 arr[5] = {1, 3, 7, 5, 2}
,求如下区间的和
[3, 4] [2, 4] [0, 3]
??
答案为:7 14 16
思路
如果不使用前缀和的话,会非常的麻烦,且如果求得区间非常多,且数值较大,时间复杂度会非常大。下面写的是不使用前缀和的时候的方法,纯循环。
代码
#include <algorithm>
#include <iostream>
using namespace std;
int arr[5] = {1, 3, 7, 5, 2};
int sum(int a, int b){int ans = 0;for( int i = a; i <= b; i++ ){ans += arr[ i ];}return ans;
}
int main( void ){cout << sum(3, 4) << " " << sum(2, 4) << " " << sum(0, 3) << endl;return 0;
}
3 计算某些区间的和( 使用前缀和 )
题目
有一个数组 arr[5] = {1, 3, 7, 5, 2}
,求如下区间的和
[3, 4] [2, 4] [0, 3]
??
答案为:7 14 16
思路
提前写一个数组比如sum,在 sum[i]
中存储 sum[0]到sum[i]
的和。
前缀和的方法:当求某个区间比如 [2, 4]
的时候,只需要计算 [0, 4] 的和 - [0, 1] 的和
,也就是 sum[4] - sum[1]
即,如果求
[a, b]
的和,只需要sum[b] - sum[a - 1]
这样的好处是,当需要计算多个区间的时候,节省了计算时间,比如[a, b]
,之前的方式是从 arr[a]
循环累加到arr[b]
,学习了前缀和以后无需这么麻烦,只需要提前将 arr[i]
到arr[0]
的和计算出来,当需要知道某个区间的和的时候,只需要进行不同位置的和的相减计算即可。
代码1 - 使用函数
// 使用前缀和计算区间
// 有一个数组 `arr[5] = {1, 3, 7, 5, 2}`,求如下区间的和
// `[3, 4] [2, 4] [0, 3]`??
// 答案为:`7 14 16`
#include <algorithm>
#include <iostream>
using namespace std;
#define N 5
int arr[5] = {1, 3, 7, 5, 2};
int sum[5];
int get_sum(int a, int b){// 如果计算的是 [0, b],直接打印 sum[b] 即可 --> sum[b] 就是 [0, b] 的和if( a == 0 ){return sum[ b ];} else {return sum[ b ] - sum[ a - 1 ];}
}
int main( void ){sum[ 0 ] = arr[ 0 ]; // 第一个元素到第一个元素的和为第一个元素for( int i = 1; i < N; i++ ){sum[ i ] = sum[i - 1] + arr[ i ];}cout << get_sum(3, 4) << " " << get_sum(2, 4) << " " << get_sum(0, 3) << endl;return 0;
}
代码2 - 使用字符串替换 #define
更简洁高效的代码
// 使用前缀和计算区间
// 有一个数组 `arr[5] = {1, 3, 7, 5, 2}`,求如下区间的和
// `[3, 4] [2, 4] [0, 3]`??
// 答案为:`7 14 16`
#include <algorithm>
#include <iostream>
using namespace std;
#define get_sum(a, b) (a ? sum[b] - sum[a - 1] : sum[b])
#define N 5
int arr[5] = {1, 3, 7, 5, 2};
int sum[5];
int main( void ){sum[ 0 ] = arr[ 0 ]; // 第一个元素到第一个元素的和为第一个元素for( int i = 1; i < N; i++ ){sum[ i ] = sum[i - 1] + arr[ i ];}cout << get_sum(3, 4) << " " << get_sum(2, 4) << " " << get_sum(0, 3) << endl;return 0;
}
相关文章:
【算法 C/C++】一维前缀和
2025 - 03 - 08 - 第 68 篇 Author: 郑龙浩 / 仟濹 【一维前缀和】 文章目录 前缀和与差分 - 我的博客1 大体介绍2 计算某些区间的和( 不使用前缀和 )3 计算某些区间的和( 使用前缀和 ) 前缀和与差分 - 我的博客 一维前缀和 【算法 C/C】一维前缀和 一维差分 【算法 C/C】一维…...
【C++】:STL详解 —— 红黑树
目录 平衡二叉查找树 红黑树的概念 红黑树的五大性质 红黑树的效率 红黑树和AVL树的比较 插入与删除操作 内存与实现复杂度 经典性能数据对比 总结 对旋转的基本理解 旋转的作用 左旋(Left Rotation) 右旋(Right Rotation…...
【A2DP】SBC 编解码器互操作性要求详解
目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…...
Mysql的卸载安装配置以及简单使用
MySQL其它问题已经更新在:MySQL完善配置---可视化-CSDN博客 一、卸载 ①控制面板卸载 ②C盘隐藏项目>ProgramData>mysql相关文件夹,还有Program file下的MySQL文件夹 ③开始菜单栏搜索>服务,找到MySQL相关服务删除,如果再…...
Ubuntu 下 nginx-1.24.0 源码分析 (1)
main 函数在 src\core\nginx.c int ngx_cdecl main(int argc, char *const *argv) {ngx_buf_t *b;ngx_log_t *log;ngx_uint_t i;ngx_cycle_t *cycle, init_cycle;ngx_conf_dump_t *cd;ngx_core_conf_t *ccf;ngx_debug_init(); 进入 main 函数 最…...
驱动开发系列43 - Linux 显卡KMD驱动代码分析(四)- DRM设备操作
一:概述 DRM(Direct Rendering Manager)是Linux内核中的一个子系统,主要负责图形硬件的管理与图形渲染的加速。它为图形驱动提供了一个统一的接口,可以使用户空间程序与图形硬件进行直接交互,而无需通过X服务器或Wayland等显示管理器。DRM不仅用于管理显卡,还处理视频输…...
PAT乙级真题(2014·冬)
大纲 1031、查验身份证-(解析)-简单题 1032、挖掘机技术哪家强-(解析)-细节题(┬┬﹏┬┬),太抠细节了 1033、旧键盘打字-(解析)-输入格式!这才是重点(┬┬﹏┬┬),让…...
快速使用MASR V3版不能语音识别框架
前言 本文章主要介绍如何快速使用MASR语音识别框架训练和推理,本文将致力于最简单的方式去介绍使用,如果使用更进阶功能,还需要从源码去看文档。仅需三行代码即可实现训练和推理。 源码地址:https://github.com/yeyupiaoling/MA…...
学习笔记:Python网络编程初探之基本概念(一)
一、网络目的 让你设备上的数据和其他设备上进行共享,使用网络能够把多方链接在一起,然后可以进行数据传递。 网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…...
硬件基础(4):(2)认识ADC参考电压
文章目录 1. **ADC参考电压的定义**2. **如何影响采样值**3. **参考电压的选择**4. **如何选择参考电压**5. **总结** **ADC参考电压(Vref)**是用于定义ADC采样范围的一个重要参数,以下是对 ADC 参考电压的详细解释: 1. ADC参考电…...
项目中同时使用Redis(lettuce)和Redisson的报错
温馨提示:图片有点小,可以放大页面进行查看... 问题1:版本冲突 直接上图,这个错表示依赖版本不匹配问题,我本地SpringBoot用的是2.7,但是Redisson版本用的3.32.5。 我们通过点击 artifactId跟进去 发现它…...
工程化与框架系列(25)--低代码平台开发
低代码平台开发 🔧 引言 低代码开发平台是一种通过可视化配置和少量代码实现应用开发的技术方案。本文将深入探讨低代码平台的设计与实现,包括可视化编辑器、组件系统、数据流管理等关键主题,帮助开发者构建高效的低代码开发平台。 低代码…...
在CentOS系统上安装Conda的详细指南
前言 Conda 是一个开源的包管理系统和环境管理系统,广泛应用于数据科学和机器学习领域。本文将详细介绍如何在 CentOS 系统上安装 Conda,帮助您快速搭建开发环境。 准备工作 在开始安装之前,请确保您的 CentOS 系统已经满足以下条件&#x…...
系统思考—组织诊断
“未经过诊断的行动是盲目的。” — 托马斯爱迪生 最近和一家教育培训机构沟通时,发现他们面临一个有意思的问题:每年招生都挺不错,但教师的整体绩效一直提升缓慢,导致师生之间存在长期的不匹配。管理层试了很多办法,…...
项目实战--网页五子棋(对战功能)(9)
上期我们完成了websocket建立连接后的数据初始化,今天我们完成落子交互的具体代码: 这里我们先复习一下,之前约定好的落子请求与响应包含的字段: 1. 发送落子请求 我们在script.js文件中找到落子的相关方法,增加发送请…...
Ubuntu系统安装Apache2方法
Ubuntu系统安装Apache2方法 一、安装 Apache2更新软件包列表安装 Apache2启动服务验证安装 二、访问默认页面三、基本配置配置文件结构目录权限访问测试 四、故障排除五、总结 一、安装 Apache2 更新软件包列表 在安装任何软件之前,建议先更新系统的软件包列表&am…...
DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)
DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…...
基于springboot和spring-boot-starter-data-jpa快速操作mysql数据库
1、创建springboot项目 2、pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…...
深度学习代码解读——自用
代码来自:GitHub - ChuHan89/WSSS-Tissue 借助了一些人工智能 2_generate_PM.py 功能总结 该代码用于 生成弱监督语义分割(WSSS)所需的伪掩码(Pseudo-Masks),是 Stage2 训练的前置步骤。其核心流程为&a…...
文件与目录权限
目录 文件权限 文件读权限(r) 文件写权限(w) 文件可执行权限(x) 目录权限 目录读权限(r) 目录写权限(w) 文件可执行权限(x)(与文件权限最大不同之处) 注意 在 Linux 系统中,…...
算法005——有效三角形个数
力扣——有效三角形个数点击链接跳转 判断三条边是否能组成三角形,大家第一时间想到的就是两边之和大于第三边 但是运用这个方法,我们需要判断三次,有一个更简单的方法,只需要判断一次 因为 C 已经是三边之中最大的了ÿ…...
Facebook 的隐私保护数据存储方案研究
Facebook 的隐私保护数据存储方案研究 在这个信息爆炸的时代,数据隐私保护已成为公众关注的热点。Facebook,作为全球最大的社交媒体平台之一,承载着海量用户数据,其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深…...
如何高效利用Spring中的@Cacheable注解?
在现代软件开发中,缓存是提升应用性能的重要手段。Spring框架提供了Cacheable注解,帮助开发者轻松实现缓存机制。今天我们就来详细聊聊Cacheable注解的使用,看看它是如何让我们的应用更加高效的! Cacheable注解的核心功能是缓存方…...
Qt 进度条与多线程应用、基于 Qt 的文件复制工具开发
练习1:Qt 进度条与多线程应用 题目描述 开发一个基于 Qt 的应用程序,该应用程序包含一个水平进度条(QSlider),并且需要通过多线程来更新进度条的值。请根据以下要求完成代码: 界面设计: 使用 QS…...
软件工程---构件
在软件工程中,构件是一个独立的、可复用的软件单元,它具有明确的功能、接口和行为,并且可以在不同的环境中加以集成和复用。构件的概念是软件架构和组件化开发的核心思想之一,其目的是促进软件系统的模块化、可维护性和可扩展性。…...
【算法 C/C++】二维差分
2025 - 03 - 08 - 第 71 篇 Author: 郑龙浩 / 仟濹 【二维差分】 文章目录 前缀和与差分 - 我的博客差分(二维)1 大体思路 | 一些区间加某数的最终结果2 二维差分原理3 例题 前缀和与差分 - 我的博客 一维前缀和 【算法 C/C】一维前缀和 一维差分 【算法 C/C】一维差分 二维前…...
灰色地带规避:知识产权校验API的商标库模糊匹配算法
在反向海淘或其他电商业务场景中,为了规避知识产权方面的灰色地带,开发知识产权校验 API 并运用商标库模糊匹配算法是很有必要的。以下将详细介绍商标库模糊匹配算法的设计与实现: 算法设计思路 商标库模糊匹配算法的核心目标是在给定一个待匹…...
LINUX网络基础 [五] - HTTP协议
目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…...
嵌入式人工智能应用-第6章 人脸检测
嵌入式人工智能应用 人脸检测 嵌入式人工智能应用1 人脸检测1.1 CNN 介绍1.2 人脸检测原理1.3 MTCNN介绍1.4 NCNN介绍2 系统安装2.1 安装依赖库NCNN2.2 运行对应的库3 总结1 人脸检测 1.1 CNN 介绍 卷积神经网络。卷积是什么意思呢?从数学上说,卷积是一种运算。它是我们学习…...
编程考古-Borland历史:《.EXE Interview》对Anders Hejlsberg关于Delphi的采访内容(中)
为了纪念Delphi在2002年2月14日发布的25周年(2020.2.12),这里有一段由.EXE杂志编辑Will Watts于1995年对Delphi首席架构师Anders Hejlsberg进行的采访记录。在这次采访中,Anders讨论了Delphi的设计与发展,以及即将到来的针对Windows 95的32位版本。 Q. 编译器引擎本身是用…...
redis数据类型以及底层数据结构
redis数据类型以及底层数据结构 String:字符串类型,底层就是动态字符串,使用sds数据结构 Map:有两种数据结构:1.压缩列表:当hash结构中存储的元素个数小于了512个。并且元 …...
C运算符 对比a++、++a、b--、 --b
#include<stdio.h> int main() { int a 21;int b 10;int c, d;c a;//先赋值给c,a本身再运算 c 21, a 22;//c a;//a本身先运算,再赋值给c a 22,c 22;printf("c %d, a %d\n",c, a); d --b;//b本身先运算,再赋值给d …...
Java EE 进阶:Spring MVC(2)
cookie和session的关系 两者都是在客户端和服务器中进行存储数据和传递信息的工具 cookie和session的区别 Cookie是客⼾端保存⽤⼾信息的⼀种机制. Session是服务器端保存⽤⼾信息的⼀种机制. Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Co…...
基于Matlab的人脸识别的二维PCA
一、基本原理 传统 PCA 在处理图像数据时,需将二维图像矩阵拉伸为一维向量,这使得数据维度剧增,引发高计算成本与存储压力。与之不同,2DPCA 直接基于二维图像矩阵展开运算。 它着眼于图像矩阵的列向量,构建协方差矩阵…...
Java 深度复制对象:从基础到实战
目录 一、深度复制的概念二、实现深度复制的方法1. 使用序列化2. 手动实现深度复制 三、总结 在 Java 编程中,对象的复制是一个常见的需求。然而,简单的复制操作(如直接赋值)只会复制对象的引用,而不是创建一个新的对象…...
【Java开发指南 | 第三十五篇】Maven + Tomcat Web应用程序搭建
读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 前言Maven Tomcat Web应用程序搭建1、使用Maven构建新项目2、单击项目,连续按两次shift键,输入"添加",选择"添加框架支持"3、选择Java Web程序4、点击&…...
TCP三次握手,四次挥手;多进程、多线程实现并发服务器
三次握手,四次挥手 三次握手示意图: SYN、ACK是TCP协议头里面的标志位 同步 SYN:仅在三次握手建立 TCP 连接时有效。当 SYN 1 而 ACK 0 时,表明这是一个连接请求报文段,对方若同意建立连接,则应在相应的…...
Java基础系列:深入理解八大基本数据类型及避坑指南
目录 一、基本数据类型概述 八大类型速查表 二、各类型详解与常见陷阱 1. 整型家族(byte/short/int/long) 2. 浮点型(float/double) 3. 字符型(char) 4. 布尔型(boolean) 三…...
【Gaussian Model】高斯分布模型
目录 高斯分布模型用于异常检测(Gaussian Model for Anomaly Detection)1. 高斯分布简介2. 高斯分布模型用于异常检测(1) 训练阶段:估计数据分布(2) 检测阶段:计算概率判断异常点 3. 示例代码4. 高斯分布异常检测的优缺点优点缺点…...
Unity--Cubism Live2D模型使用
了解LIVE2D在unity的使用--前提记录 了解各个组件的作用 Live2D Manuals & Tutorials 这些文件都是重要的控制动画参数的 Cubism Editor是编辑Live2D的工具,而导出的数据的类型,需要满足以上的条件 SDK中包含的Cubism的Importer会自动生成一个Pref…...
Day4 C语言与画面显示练习
文章目录 1. harib01a例程2. harib01b例程3. harib01e例程4. harib01f例程5. harib01h例程 1. harib01a例程 上一章主要是将画面搞成黑屏,如果期望做点什么图案,只需要再VRAM里写点什么就好了,使用nask汇编语言实现一个函数write_mem8&#…...
【redis】全局命令exists、del、expire、ttl(惰性删除和定期删除)
exists——判定 key 是否存在 语法: exists key [key...] # 返回值:key 存在的个数针对多个 key 来说,是非常有用的时间复杂度 O ( 1 ) O(1) O(1) Redis 组织这些 key 就是按照哈希表的方式来组织的。Redis 支持很多数据结构指的是 value …...
VUE3项目的文档结构分析
1. Vue 3 项目的文档结构 Vue 3 项目通常基于 Vue CLI 或 Vite 等工具创建,其文档结构如下: 常见目录结构 my-vue-project/ ├── public/ # 静态资源目录 │ ├── index.html # 入口页面 ├── src/ …...
Linux笔记---自定义shell
目录 前言 1. 程序框架 2. 打印命令行提示符 2.1 获取用户名(GetUserName) 2.2 获取主机名(GetHostName) 2.3 获取工作目录(GetPwd) 3. 获取命令行输入 4. 判断是否有重定向 5. 解析命令行 6. 内建命令 6.1 内建命令的特点 6.2 常见内建命令 6.3 内建命令 vs 外部命…...
步进电机软件细分算法解析与实践指南
1. 步进电机细分技术概述 步进电机是一种将电脉冲信号转换为角位移的执行机构,其基本运动单位为步距角。传统步进电机的步距角通常为 1.8(对应 200 步 / 转),但在高精度定位场景下,这种分辨率已无法满足需求。细分技术…...
mapbox开发小技巧
自定义图标 // 1、单个图标 const url ./static/assets/symbols/code24x24/VIDEO.png // 图标路径 map.loadImage(url ,(error, image) > {if (error) throw errormap.addImage(video-icon, image) })// 2、雪碧图利用canvas // json和png图片 function getStyleImage(fil…...
ApoorvCTF Rust语言逆向实战
上周参加了国外的比赛,名称叫:ApoorvCTF 看一下老外的比赛跟我们有什么不同,然后我根据国内比赛对比发现,他们考点还是很有意思的,反正都是逆向,哈哈哈 Rusty Vault 题目描述: In the heart…...
IntersectionObserver接口介绍
IntersectionObserver API 是浏览器提供的一个用于异步观察目标元素与其祖先元素或视口(Viewport)交叉状态(即是否进入或离开视口)的接口。在 IntersectionObserver 出现之前,开发者通常需要通过监听 scroll 事件或使用…...
AI壁纸进阶宝典:让创作效率与质量飞速提升的法门
在数字化创意浪潮席卷的当下,AI壁纸以其独特魅力和无限可能,吸引了众多设计爱好者和专业设计师的目光。然而,如何在众多创作者中脱颖而出,打造令人惊艳的AI壁纸呢?本文将从基础到进阶,全方位剖析AI壁纸创作…...
Releases(发布) 和 版本管理 是两个紧密相关的概念
在软件开发和维护中,Releases(发布) 和 版本管理 是两个紧密相关的概念,特别是在开源项目或企业软件开发中。 1. Releases(发布) Release 是指软件的一个正式发布版本,通常经过开发、测试、修复 Bug,并被认为是足够稳定和可用于生产环境的版本。 主要特点 里程碑:通…...