一.前言:
我们都知道 "前缀和"数组 适用于 "原数组 " 不被修改的场景下,频繁查询某一个区间的累加和---查询时候时间复杂度是 O(1)
本文要提及的 "差分数组" 则是 适用于频繁对原数组的某一个 "区间" 的元素进行增减时-----修改数据的时候时间复杂度就是O(1)
我们会发现这两种数组都运用了空间换时间的思想,降低在某项功能的时间复杂度
简单介绍了两者的异同之后,我们步入今天的正题,差分数组!
二.差分数组
1.储存内容:
差分数组储存的内容是 "原数组" 的第 i 项 与 第 i - 1 项的差值(第一个元素特殊处理)
假设原数组是nums , 差分数组是 diff
• diff【0】= nums[0]
• diff【i】 = nums【i】 - nums【i - 1】

那么我们就可以顺利成章的写出构造"差分数组"的代码了
2.构造:
cpp
class difference{
private:
vector<int> diff;
public:
difference(vector<int>& nums){
diff = vector<int>(nums.size(),0);//构造了一个nums大小的差分数组
diff[0] = nums[0];
for (int i = 1; i < nums.size(); i++){
diff[i] = nums[i] - nums[i-1];
}
}// nums是原数组
3.原数组区间增删的更改------核心功能:
假设我们要给原数组 i 到 j 区间都增加 val
我们知道差分数组的每一个下标值都代表的是 原数组 i 下标和 i -1 下标的"差值"
那么 i 位置的 差值 相比 i -1 是不是 会增加 "val"
i 到 j 区间因为都增加,那么差值不变,我们不动它
j + 1 相比于 j 下标 是不是就小了 "val"
那么代码可出:
cpp
void increment(int i , int j , int val){
diff[i] += val;
if (j + 1 < diff.size()){
diff[j+1] -= val;
}
}
4. 返回差分数组
cpp
vector<int> result(){
vector<int> res(diff.size());
res[0] = diff[0];
for (int i = 1; i < diff.size(); i++){
res[i] = res[i-1] + diff[i];
}
return res;
}
三.结语:
希望本文对你有所帮助
喜欢的话,可以点一个免费的赞和收藏