基础算法前缀和与差分

前言

本次博客会介绍一维和二维的前缀和,以及一维二维差分的基本使用,尽量画图,多使用配合文字

使大家理解,希望有所帮助吧

一维前缀和

问题描述

这里有一个长度为n的数组,我们要算出【2,5】区间的元素和

暴力思路

要计算一个数组区间的和可以直接把它遍历一遍,其实相信大家肯定可以敲出这个简单的代码

我们这里简单的敲一敲

//这里可以改变数组的大小
#define N 10
int main()
{int arr[N] = { 1,2,3,4,5,6,7,8,9,10 };printf("请输入两个数表示区间");//表示两个区间int left;int right;long long sum = 0;scanf("%d %d",&left,&right);for (int i = left; i <= right; i++)sum+=arr[i];printf("%lld",sum);return 0;
}

这里的时间复杂就是0(n)

如果我们要计算m次区间和的话时间复杂度为o(n*m)

前缀和思路

我们可以直接用一个sum数组分别去记录它的前n项和

数组的下边代表项数

举个例子

有一个数组 1 2 3 4 5 6 7 8 9 10

那么它的sum数组为 1 3 6 10 15 21 28 36 45 55

每一个元素都是前n项和    数组的下标+1代表几个元素的和

公式 sum[i]=sum[i-1]+arr[i];

这里是递推式,后一项由前一项得到,算了怕大家不懂

sum[0]=arr[0]

sum[1]=sum[0]+arr[1]

sum[2]=sum[1]+arr[2]

```````````

这下该懂了吧,我们可以通过sum数组来求区间和

看图

大家看到了,我们只要sum[right]-sum[left-1]就可以解决问题 o(1)

区间分析

大家看 如果是[0,5]区间那么他就有可能会出现越界的情况呀

毕竟是sum[5]-sum[-1],那不就错了吗

所以我们的sum数组应该从1开始的我们默认让sum[0]=0

这样就不会出现区间问题,而此时区间代表的就不是数组下标而是第几个数到第几个数

ok

看代码吧

int sum[11] = {0};
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int l, r;printf("请输入两个数,表示左右区间");scanf("%d %d", &l, &r);int size = sizeof(arr) / sizeof(arr[0]);//计算前缀和数组for (int i = 1; i <=size; i++){sum[i] = sum[i - 1] + arr[i-1];}int result = sum[r] - sum[l - 1];printf("%d",result);return 0;
}

这样就可以降低时间复杂度了

一维差分

问题描述

有一个 数组,我们要对 [left,right]  区间的元素进行加减操作 操作m次

暴力思路

还是这样,我们还是遍历一遍区间,然后进行操作

其实暴力代码还是一样的,这里还是别懒了,再给大家操作一遍

//这里可以改变数组的大小
#define N 10
int main()
{int arr[N] = { 1,2,3,4,5,6,7,8,9,10 };printf("请输入两个数表示区间");//表示两个区间int left;int right;scanf("%d %d",&left,&right);printf("请输入操作数");int a;scanf("%d",&a);for (int i = left; i <= right; i++)arr[i]+=a;for(int i=0;i<N;i++)printf("%d",arr[i]);return 0;
}

差分思路

我们先算一遍差分数组

比如 有一个数组arr[10]={1,2,3,4,5,6,7,8,9,10};

我们先算一个d[10]数组

d[0]=arr[0] d[1]=arr[1]-arr[0] d[2]=arr[2]-arr[1] d[3]=arr[3]-arr[2]

······d[9]=arr[9]-arr[8]

那么d[10]={1,1,1,1,1,1,1,1,1,1};

差分数组的性质

1 大家发现没,差分和前缀和是逆运算,也就是我们可以通过前缀和的公式计算差分数组得到原数组

2 差分数组的前面元素加上或减去一个数,在进行前缀和后会把所加的数的影响给到后面的元素

可以举例

比如一个差分数组

0 0 0 0 0 0 0 0 0 0

我们让第一个数加上一个1  变成 

1 0 0 0 0 0 0 0 0 0

通过前缀和,所求的原数组为

1 1 1 1 1 1 1 1 1 1

这种影响会从前到后影响

对吧,那么如何解决问题呢,只要控制影响,利用差分数组的逆过来求前缀和数组

最后把结果加入到所求的数组中完成任务

那我们还是画个图,来理解

接下来看代码

//差分
//差分可以让某个区间全体加上或减去一个数
//除去差分数组可达到o(1)的时间复杂
int sub[20] = {0};
void fun(int left, int right, int num)
{sub[left] += num;sub[right+1]-=num;//只要数组的大小大于计算数组就不用担心越界问题
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int size = sizeof(arr) / sizeof(arr[0]);//差分其实是前缀的逆运算//也就是可以说差分后再前缀可以得到原来的数组//所以完全可以不用去算差分数组而是创建一个数组把它当成//差分数组,再求前缀和,把它与原来的数组相加可以得到结果fun(1, 2, 5);for (int i = 1; i < size; i++){sub[i] += sub[i - 1];}for (int i = 0; i < size; i++)arr[i] += sub[i];for (int i = 0; i < size; i++)printf("%d ", arr[i]);return 0;
}

总结

这个逻辑实现确实比较的简单,但是仍然有很多的细节,尤其是边界问题,

这两种算法可以说非常常用,下次博客再写一写二维的前缀和差分吧

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

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

相关文章

Mogdb 5.0新特性:SQL PATCH绑定执行计划

前言 熟悉Oracle的dba都知道&#xff0c;生产系统出现性能问题时&#xff0c;往往是SQL走错了执行计划&#xff0c;紧急情况下&#xff0c;无法及时修改应用代码&#xff0c;dba可以采用多种方式针对于某类SQL进行执行计划绑定&#xff0c;比如SQL Profile、SPM、SQL Plan Base…

Linux——网络管理nmcli

nmcli 不能独立使用&#xff0c;需要对应的服务启动 1. NetworkManager.service 2. 网络配置和服务不相关 3. 通过 nmcl &#xff49; 建立网络配置和网卡之前的映射关系 网卡 简称&#xff1a;nmcli d DEVICE &#xff1a;物理设备 TYPE: 物理设备类型 ethernet 以太网…

C++设计模式:适配器模式(十四)

1、定义与动机 定义&#xff1a;将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 动机&#xff1a; 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象”放在新的环境…

强固型工业电脑在码头智能闸口、OCR(箱号识别)、集装箱卡车车载电脑行业应用

集装箱卡车车载电脑应用 背景介绍 针对码头集装箱卡车的调度运用, 结合码头TOS系统设计出了各种平台的车载电脑(VT系列)和车载LED显示屏(VLD系列)&#xff0c;同时提供各种安装支架&#xff0c;把车载电脑固定到狭小的驾驶室中&#xff1b;同时提供了各种天线选择&#xff08;…

【JVM常见问题总结】

文章目录 jvm介绍jvm内存模型jvm内存分配参数jvm堆中存储对象&#xff1a;对象在堆中创建分配内存过程 jvm 堆垃圾收集器垃圾回收算法标记阶段引用计数算法可达性分析算法 清除阶段标记清除算法复制算法标记压缩算法 实际jvm参数实战jvm调优jvm常用命令常用工具 jvm介绍 Java虚…

高速公路交通运输大数据平台解决方案

前言 交通运输行业面临着多重挑战。其管控困难&#xff0c;涉及广泛地理范围&#xff0c;导致监控成本高且难以及时响应&#xff1b;同时&#xff0c;行业内数据量大&#xff0c;地理信息数据繁多&#xff0c;缺乏高效的可视化工具来揭示数据规律并优化业务&#xff1b;货运和…

回溯算法-组合问题

回溯算法-组合问题 77. 组合 问题描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&a…

05集合-CollectionListSet

Collection体系的特点、使用场景总结 如果希望元素可以重复&#xff0c;又有索引&#xff0c;索引查询要快? 用ArrayList集合, 基于数组的。(用的最多) 如果希望元素可以重复&#xff0c;又有索引&#xff0c;增删首尾操作快? 用LinkedList集合, 基于链表的。 如果希望增…

基于SpringBoot + Vue实现的奖学金管理系统设计与实现+毕业论文+答辩PPT

介绍 角色:管理员、学院负责人、学校负责人、学生 管理员:管理员登录进入高校奖助学金系统的实现可以查看系统首页、个人中心、学生管理、学院负责人管理、学校负责人管理、奖学金类型管理、奖学金申请管理、申请提交管理、系统管理等信息 学院负责人:学院负责人登录系统后&am…

python3--lxml pytoml.core.TomlError expected_equals报错解决

文章目录 一、问题二. 解决方法&#xff1a;三. 参考&#xff1a;四. 总结 一、问题 在ubuntu的armbian上的python3中安装lxml时报错了 安装命令是 pip3 install lxml报错简略信息如下图 File "/usr/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl/pytoml/par…

2.1K Star微软开源的高质量 iot库

功能描述 该项目是一个开源的 .NET Core 实现&#xff0c;旨在帮助开发者构建适用于物联网(IoT)设备和场景的应用程序。它提供了与传感器、显示器和输入设备等相互作用所需的 GPIO 引脚、串口等硬件的接口。该仓库包含 System.Device.Gpio 库以及针对各种板卡&#xff08;如 Ra…

redis底层数据结构之ziplist

目录 一、概述二、ziplist结构三、Entry结构四、为什么ZipList特别省内存五、ziplist的缺点 上一篇 redis底层数据结构之SDS 下一篇 明天更新 一、概述 一种连续内存空间存储的顺序数据结构&#xff0c;每个元素可以是字符串或整数。优点:节省内存空间。适用于存储小规模的列表…

STM32 | USART实战案例

STM32 | 通用同步/异步串行接收/发送器USART带蓝牙(第六天)随着扩展的内容越来越多,很多小伙伴已经忘记了之前的学习内容,然后后面这些都很难理解。STM32合集已在专栏创建,方面大家学习。1、通过电脑串口助手发送数据,控制开发板LED灯 从题目中可以挖掘出,本次使用led、延…

【Linux文件系统开发】认知篇

【Linux文件系统开发】认知篇 文章目录 【Linux文件系统开发】认知篇一、文件系统的概念二、文件系统的种类&#xff08;文件管理系统的方法&#xff09;三、分区四、文件系统目录结构五、虚拟文件系统&#xff08;Virtual File System&#xff09;1.概念2.原因3.作用4.总结 一…

减肥变成一种趋势!足球直播是一种刺激——早读(逆天打工人爬取热门微信文章解读)

看直播是打发时间的好方式 引言Python 代码第一篇 洞见 跌入粪坑的钟美美&#xff0c;才是真正的“人间清醒”第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 变化是生活的法则 而直播的比赛则是这一法则的缩影 每一秒都可能带来转折和惊喜 充满了未知和奇迹 引…

磁盘损坏无法读取:原因、恢复方案与防范之道

在数字化信息爆炸的时代&#xff0c;磁盘作为数据存储的重要载体&#xff0c;承载着无数重要的文件和资料。然而&#xff0c;当磁盘突然损坏&#xff0c;无法读取数据时&#xff0c;我们往往会陷入困境&#xff0c;焦虑不已。面对这种情况&#xff0c;我们该如何应对&#xff1…

Yolo-world使用

1、安装 python pip install ultralytics 前往官网下载模型&#xff1a;https://docs.ultralytics.com/models/yolo-world/#key-features 我这里使用yolov8s-world.pt举例 最简单的使用示例 if __name__ __main__:model YOLO(model/yolov8s-world.pt)results model.pre…

中仕公考:考公还是考编?区别是什么?

公务员和事业编应该如何选择?区别在哪里?中仕为大家总结以下几点&#xff0c;看完就明白了! 事业编制&#xff1a;主要指从事事业单位工作人员所获得的稳定的事业单位编制。 公务员&#xff1a;是指在各级政府机关中&#xff0c;行使国家行政职权&#xff0c;执行国家公务的…

2024HW ---->内网横向移动

在蓝队的面试过程中&#xff0c;如果你会内网渗透的话&#xff0c;那是肯定的一个加分选项&#xff01;&#xff01;&#xff01; 那么从今天开始&#xff0c;我们就来讲一下内网的横向移动&#xff01;&#xff01;&#xff01; 目录 1.域内任意用户枚举 2.Password-Sprayi…

ffmpeg入门

ffmpeg入——安装 Fmpeg地址 FFmpeg源码地址&#xff1a;GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git FFmpeg可执行文件地址&#xff1a;Download FFmpeg Windows平台 ​ ​ Windows平台下载解压后如图所示&#xff08;文件名称以-share结尾的…