1,什么是差分数组:
差分数组就是一个用来记录原数组相邻数据间差值的数组,比如
差分数组的arr[i] = arr[i] - arr[i - 1] (i > 0) , i = 0 时差分数组的arr[i] 就是原数组的0下标的元素。
2,差分数组有什么用:
当我们想让一个整形数组的某段区间加上或减去同一个数时,我们的一般操作就是遍历我们想改变的区间,依次计算,当数组足够大并且需要计算的区间足够大而且需要多次进行这种操作时,这样的操作所耗时间比较多。这时,我们可以利用差分数组,只需修改需要计算的区间的边界值就可以做到同步修改该区间的所有值,之后只需从差分数组的0下标元素往后累加,就可以得到修改后的数组的数据,修改时的时间复杂度为O(1)。
代码示例:
#include<iostream>
using namespace std;
int main()
{
int arr[5] = {6 , 4 , 3 , 1 ,5};//原数组
for(int i = 4 ; i > 0 ; i--) arr[i] = arr[i] - arr[i - 1];//转化为差分数组
//若让arr数组从下标left到right 都加上k 可以让差分数组 arr[left] += k , arr[right + 1] -=k (当right小于arr.size() - 1 时)
arr[1] += 5;//从下标1 到3 都加上5
arr[3 + 1] -= 5;
//再让区级[2,4] 的元素都加2
arr[2] += 2;//4 已到末尾 不会影响到后面的数据 所以可以不用减
for(int i = 1 ;i < 5 ; i++)
{
arr[i] += arr[i - 1];//还原修改后的数组
}
for(auto data : arr) cout<<data<<' ';
return 0;
}