Java之差分算法

文章介绍了差分数组的概念,用于解决区间多次加减操作的问题,降低时间复杂度。通过示例解释了差分的构造、操作步骤,并提供了两个应用实例:小明的彩灯问题和找出人口最多的年份。这两个问题都利用差分数组来高效计算结果。

目录

一.差分

1.什么是差分

2.差分数组所解决的问题

3.差分解题的步骤

4.举例差分解题

二.小明的彩灯

1.题目描述

题目描述

输入描述

输出描述

2.问题分析

3.代码实现

三.人口最多的年份

1.题目描述

2.问题分析

3.代码实现


一.差分

1.什么是差分

差分的概念:有一列数字:如:a[0],a[1],a[2],.....a[n],它的每一项与前边一项进行相减的操作

例如差分数组:b[0]=a[0],b[1]=a[1]-a[0],b[2]=a[2]-a[1],.......,b[n]=a[n]-a[n-1]  类似于这样的操作就叫做差分

2.差分数组所解决的问题

差分数组主要用于解决:对某些不确定的区间多次进行加减操作时,如果每次都是对这些区间遍历操作,(设进行n次操作,每次对长度为m的数组进行操作),时间复杂度为O(nm),如果使用差分来进行解决的话,可以将时间复杂度变为O(n)

注意:差分只能够解决加减的问题,不能够解决乘除的问题

3.差分解题的步骤

1.构造差分数组:    数组为:a[0],a[1],a[2],.....a[n] 

那么差分数组为:b[0]=a[0],b[1]=a[1]-a[0],b[2]=a[2]-a[1],.......,b[n]=a[n]-a[n-1]

2.进行相对应的加减操作(例如,需要对left到right个元素全部加x,b[left]+=x,b[right]-=x)

3.差分还原(进行求前缀和的操作)

a[0]=b[0], a[1]=b[1]+a[0],a[2]=a[1]+b[2]

4.举例差分解题

对于数组nums={1,2,4,6,7,9},将第2到第4个元素加3,第3到第5个元素减1,求操作后的数组

1.构造差分数组

diff[0]=nums[0]=1  diff[1]=nums[1]-nums[0]=1  diff[2]=nums[2]-nums[1]=2

diff[3]=nums[3]-nums[2]=2   diff[4]=nums[4]-nums[3]=1    diff[5]=nums[5]-nums[4]=2

diff={1,1,2,2,1,2}

2.进行相应操作<

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

允歆辰丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值