【算法】前缀和与差分

大家好!今天我们来学习前缀和与差分算法。

目录

1. 一维前缀和

1.1 定义

1.2 计算方法

1.3 作用

1.4 适用场景

1.5 模板题

1.6 总结

2. 二维前缀和 

2.1 定义

2.2 计算方法

2.3 模板题

2.4 总结

3. 一维差分

3.1 定义

3.2 差分数组

3.3 差分标记

3.4 作用

3.5 适用场景

3.6 模板题

4. 二维差分

4.1 定义

4.2 差分数组

4.3 差分标记

4.4 模板题


1. 一维前缀和

1.1 定义

前缀和是一段序列里面前n项和。

例如,给定一个一维数组a,它的前缀和s[i]表示第1个元素到第i个元素的总和。也就是s[i]=a[1]+a[2]+a[3]+...+a[i-1]+a[i]

1.2 计算方法

s[i]=s[i-1]+a[i]

需要注意的是,数组的下标都是从1开始的!!!

1.3 作用

通过使用前缀和算法,可以在 O(1) 的时间复杂度内计算出任意区间的和,而不需要遍历整个区间。这对于多次查询区间和的场景非常有用,在处理一些数据范围较大的问题时非常高效。

1.4 适用场景

一个长度为n的数组a,m次询问,每次的询问区间是[l,r],求区间内所有数的和。

在没学过前缀和之前,对于求一段区间的和,我们的想法就是通过遍历这个区间的所有元素,直接暴力求解:

for (int i = l; i <= r; i++) {s += a[i];
}	

这样直接遍历求和的做法时间复杂度是O(N)。如果再有m次询问,就需要两重循环求解,时间复杂度就为O(N*M),这样的时间复杂度非常高。

这时我们就可以用前缀和算法,通过O(1)的时间复杂度,直接求出某段区间的和。

具体做法:

首先做一个预处理,定义一个数组s,s[i]表示数组第1个元素到第i个元素的和。

求前缀和:

for (int i = 1; i <= n; i++) {s[i] = s[i - 1] + a[i];
}

查询求区间和:

区间和为s[r]-s[l-1]

例如下图就表示了区间[3,5]的区间和。

即s[5]-s[2]

while (m--) {int l, r;cin >> l >> r;cout << s[r] - s[l - 1] << endl;
}

1.5 模板题

AcWing 795. 前缀和

原题链接:https://www.acwing.com/problem/content/797/

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e5+10;
ll a[N],s[N];int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m; cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]+a[i];  //求前缀和}while(m--){int l,r;cin>>l>>r;cout<<s[r]-s[l-1]<<'\n';  //求区间和}return 0;
}

1.6 总结

2. 二维前缀和 

2.1 定义

一个二维数组a,它的前缀和二维数组s[i][j]表示以(1,1)为左上角元素,以(i,j)为右下角元素的矩形块中所有元素的总和。

2.2 计算方法

s[i][j]=a[i][j]+s[i][j-1]+s[i-1][j]-s[i-1][j-1]

2.3 模板题

AcWing 796. 子矩阵的和

原题链接:https://www.acwing.com/problem/content/798/

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1010;
ll a[N][N],s[N][N];int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m,q; cin>>n>>m>>q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];s[i][j]=a[i][j]+s[i][j-1]+s[i-1][j]-s[i-1][j-1]; //求二维前缀和}}while(q--){int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;cout<<s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]<<'\n';  //求出子矩阵的和}return 0;
}

2.4 总结

3. 一维差分

3.1 定义

差分:很少的询问,但有很多改变数组的操作,每次让不同区间[l,r]内的每个数都加c或者减c

差分是前缀和的逆运算

3.2 差分数组

如果我们要对一个数组分成很多区间,对这些区间做多次操作,每次操作是对某个区间内的所有元素做相同的加减操作,若一个个地修改区间内的每个元素,非常耗时。

这里我们就引入“差分数组”的概念。

差分数组,顾名思义,就是由原数组的两个元素作差得到

这里我们令原数组为a,数组长度为n,再引入一个数组d表示差分数组,那么我们就可以通过遍历数组a,从而求得差分数组d。

for (int i = 1; i <= n; i++) {d[i] = a[i] - a[i - 1];
}

差分数组的前缀和是原数组

3.3 差分标记

假设我们要修改的区间为[l,r] ,差分数组为d,我们要让[l,r]区间的每个数都加c。

我们就打标记:

d[l] += c;
d[r + 1] -= c;

原理:某一位+c,会把这个操作带到后面。

3.4 作用

引入差分数组d,当修改某个区间时,只需要修改这个区间的端点,就能记录整个区间的修改,而对端点的修改非常简单,复杂度为O(1)。

当所有修改操作结束后,再利用差分数组计算出新的原数组。

3.5 适用场景

长度为n的数组a,1次询问,m次操作,每次令区间[l,r]的每个数+c或-c。

3.6 模板题

AcWing 797. 差分

原题链接:https://www.acwing.com/problem/content/799/

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e5+10;
ll a[N],d[N];int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m; cin>>n>>m;for(int i=1;i<=n;i++) {cin>>a[i];d[i]=a[i]-a[i-1];  //求差分数组}while(m--){int l,r,c;cin>>l>>r>>c;d[l]+=c;  //差分标记d[r+1]-=c;}for(int i=1;i<=n;i++){d[i]=d[i-1]+d[i];  //差分数组前缀和cout<<d[i]<<' ';}return 0;
}

4. 二维差分

4.1 定义

n行m列的矩阵,左上角数组元素坐标为(x1,y1),右下角数组元素坐标为(x2,y2),1次询问,m次操作,每次操作让矩阵的所有元素都加c或者减c。

4.2 差分数组

设原数组为n行m列的二维数组a,差分数组为d。

for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){d[i][j]=a[i][j]-a[i][j-1]-a[i-1][j]+a[i-1][j-1];}
} 

4.3 差分标记

假设我们要修改的矩阵的左上角元素坐标为(x1,y1),右下角坐标为(x2,y2),差分数组为d,我们要让这个矩阵内的每个数都加c。

我们就打标记:

d[x1][y1]+=c;   
d[x1][y2+1]-=c;
d[x2+1][y1]-=c;
d[x2+1][y2+1]+=c;

4.4 模板题

AcWing 798. 差分矩阵

原题链接:https://www.acwing.com/problem/content/800/

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1010;
ll a[N][N],d[N][N];int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m,q; cin>>n>>m>>q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];d[i][j]=a[i][j]-a[i][j-1]-a[i-1][j]+a[i-1][j-1];  //求差分数组}} while(q--){int x1,y1,x2,y2,c;cin>>x1>>y1>>x2>>y2>>c;d[x1][y1]+=c;   //差分标记d[x1][y2+1]-=c;d[x2+1][y1]-=c;d[x2+1][y2+1]+=c;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){d[i][j]=d[i][j]+d[i][j-1]+d[i-1][j]-d[i-1][j-1];  //差分数组前缀和cout<<d[i][j]<<' ';}cout<<'\n';}return 0;
}

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

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

相关文章

什么是JavaScript中的严格模式(strict mode)?应用场景是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 严格模式&#xff08;Strict Mode&#xff09;&#xff1a;⭐ 使用场景⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

SpringMVC多文件上传

文章目录 一、文件上传1.1 导入pom依赖1.2 配置文件上传解析器1.3 设置文件上传表单1.4 实现文件上传 二、文件下载三、多文件上传四、JRebel的使用 一、文件上传 1.1 导入pom依赖 <commons-fileupload.version>1.3.3</commons-fileupload.version><dependency…

高德地图实现-微信小程序地图导航

效果图&#xff1a; 一、准备阶段 1、在高德开放平台注册成为开发者2、申请开发者密钥&#xff08;key&#xff09;。3、下载并解压高德地图微信小程序SDK 高德开放平台&#xff1a; 注册账号(https://lbs.amap.com/)) 申请小程序应用的 key 应用管理(https://console.ama…

苹果“FindMy”APP

“FindMy”是一项 Apple 服务&#xff0c;可以定位设备。在 iOS 13 之前&#xff0c;Apple将该服务拆分为单独的应用程序&#xff1a;“查找我的 iPhone”&#xff08;或 iPad 或 Mac&#xff09;和“查找我的朋友”。该服务适用于iPhone、iPad、Mac、Apple Watch、AirPods、Ai…

MyBatisPlus(二)基础Mapperr接口:增删改查

MyBatisPlus&#xff1a;基础Mapper接口&#xff1a;增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(use…

什么是接口自动化?为什么要做?和怎么做接口自动化?

服务端接口测试介绍 什么是服务端&#xff1f; 一般所说的服务端是指为用户在 APP 或 PC 使用的互联网功能提供数据服务的背后的一切。以天猫精灵智能音箱系列的产品链路为例&#xff0c;服务端便是网关&#xff08;包括网关在内&#xff09;之后的链路。 什么是接口&#xf…

张雪峰说网络空间安全专业

网络空间安全专业是一个涵盖了计算机科学、信息安全、法律等多个领域的学科&#xff0c;旨在研究保护网络空间的信息系统和数据不被非法侵入、破坏、篡改、泄露的技术和管理手段。 网络安全专业的重要性 随着网络技术的发展&#xff0c;网络安全问题也日益凸显&#xff0c;黑客…

避免使用违规词,企业新媒体营销应注重品牌形象维护

随着越来越多的主体入局新媒体平台&#xff0c;为了维护平台健康的内容生态和创造良好的社区氛围&#xff0c;社交平台在内容上的监管越发严格。 不可避免的&#xff0c;很多做新媒体营销的企业开始陷入与平台审核的“拉扯”之中。 为了让品牌账号在各平台上顺利运营&#xff0…

Linux C++ 海康摄像头 Alarm Demo

项目结构 CMakeLists.txt cmake_minimum_required(VERSION 3.7)SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")project(CapPicture…

vue2以ElementUI为例构建notify便捷精美提示

我们先引入一个 第三方UI库 这里 我们以elementUI为例 先引入依赖 npm install element-ui --save然后 在 main.js 入口文件中 引入一下 import ElementUI from element-ui import element-ui/lib/theme-chalk/index.cssVue.use(ElementUI)然后 在组件中使用 this.$notify({…

代码随想录算法训练营第49天|121. 买卖股票的最佳时机,买卖股票的最佳时机II

链接: 121. 买卖股票的最佳时机 链接: 122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出…

RTE 领域近期词云统计发布;谷歌开始新一轮「瘦身」计划;使用ChatGPT之后智力提高 50%丨RTE开发者日报 Vol.50

开发者朋友们大家好&#xff1a; 这里是**「RTE 开发者日报」**&#xff0c;每天和大家一起看新闻、聊八卦。不知不觉&#xff0c;我们的日报已经发布了 50 期&#xff0c;作为 RTE 领域最垂直的日报栏目&#xff0c;我们的社区编辑团队会整理分享 RTE &#xff08;Real Time …

云计算——ACA学习 云计算分类

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 前期回顾 本期介绍 一.云计算分类 1.公有云…

模拟实现C语言--strcat函数

模拟实现C语言–strcat函数 文章目录 模拟实现C语言--strcat函数一、strcat函数是什么&#xff1f;二、使用示例二、模拟实现 一、strcat函数是什么&#xff1f; 作用是把源数据追加到目标空间 char * strcat ( char * destination, const char * source );源字符串必须以 ‘…

誉天在线项目-UML状态图+泳道图

什么是UML UML&#xff08;Unified Modeling Language&#xff09;是一种用于软件系统建模的标准化语言。它提供了一组图形符号和规范&#xff0c;用于描述和设计软件系统的结构、行为和交互。 UML图形符号包括类图、用例图、时序图、活动图、组件图、部署图等&#xff0c;每…

基础术语和模式的学习记录

1 范围 本文件界定了政府和社会资本合作(PPP) 的基础术语&#xff0c;给出了政府和社会资本合作(PPP) 的 模 式 分类和代码。 本文件适用于政府和社会资本合作(PPP) 的所有活动。 2 规范性引用文件 本文件没有规范性引用文件。 3 基础术语 3.1 PPP 主体 3.1.1 政府和社…

Apache HTTPD 漏洞复现

文章目录 Apache HTTPD 漏洞复现1. Apache HTTPD 多后缀解析漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.4 获取GetShell1.5 漏洞防御 2. Apache HTTPD 换行解析漏洞-CVE-2017-157152.1 漏洞描述2.2 漏洞复现2.3 漏洞利用2.4 修复建议 3. Apache HTTP Server_2.4.49 路径遍历和…

十七、Webpack搭建本地服务器

一、为什么要搭建本地服务器&#xff1f; 目前我们开发的代码&#xff0c;为了运行需要有两个操作&#xff1a; 操作一&#xff1a;npm run build&#xff0c;编译相关的代码&#xff1b;操作二&#xff1a;通过live server或者直接通过浏览器&#xff0c;打开index.html代码…

webpack实战:最新QQ音乐sign参数加密分析

文章目录 1. 写在前面2. 接口抓包分析3. 扣webpack代码4. 补浏览器环境5. 验证加密结果 1. 写在前面 现在&#xff01;很多的网站使用Webpack加载和处理JS文件。所以对于使用了Webpack加载的JS代码&#xff0c;一旦它们被打包并在浏览器中执行&#xff0c;通常是难以直接阅读和…

PMP考试注意事项有哪些?

1. PMI明确规定&#xff1a;不允许考生使用自带文具&#xff0c;包括自带的笔、削笔刀、橡皮、笔袋、计算器和草稿纸等。 2. 本次考试考场内为每位考生配备2B铅笔、橡皮、计算器(若有需要)和草稿纸。如文具有缺损或考试过程中如需更换铅芯等&#xff0c;请向监考老师举手示意。…