前缀和和差分

前缀和(Prefix Sum)和差分(Difference Array)是处理数组问题时常用的两种数据结构或算法技巧,它们可以加速某些类型的查询,尤其是在涉及数组元素累积和或变化量的情况下。

前缀和(Prefix Sum)

前缀和是一种将数组元素的累积和存储在新数组中的技术。对于一个数组 a,其前缀和数组 prefixSum 定义如下:

prefixSum[i] = a[0] + a[1] + ... + a[i-1]

这样,你可以在 O(1) 时间内查询数组 a 中任意子区间 [l, r)(左闭右开)的和,计算方式为:

sum = prefixSum[r] - prefixSum[l]

用途

  • 快速计算任意子区间的元素和。
  • 处理与数组元素累积和有关的问题。

实现

vector<int> computePrefixSum(const vector<int>& a) {
    int n = a.size();
    vector<int> prefixSum(n, 0);
    for (int i = 1; i <= n; ++i) {
        prefixSum[i] = prefixSum[i - 1] + a[i - 1];
    }
    return prefixSum;
}

 

差分(Difference Array)

差分数组是一种基于原数组生成新数组的技术,新数组中的每个元素是原数组中相邻元素的差。对于一个数组 a,其差分数组 diff 定义如下:

diff[i] = a[i] - a[i - 1] (对于 i > 0diff[0] = a[0]

这样,你可以在 O(1) 时间内恢复原数组的任意元素,或者快速计算任意子区间的和。

用途

  • 快速修改数组中的元素(例如,对某个区间的所有元素同时加上或减去一个值)。
  • 处理与数组元素变化量有关的问题。

实现

vector<int> computeDifference(const vector<int>& a) {
    int n = a.size();
    vector<int> diff(n, 0);
    diff[0] = a[0]; // 第一个元素没有前一个元素,所以直接赋值
    for (int i = 1; i < n; ++i) {
        diff[i] = a[i] - a[i - 1];
    }
    return diff;
}

前缀和和差分都是处理数组问题的有效工具,它们可以显著提高某些类型问题的解决效率。在实际应用中,选择哪一种技术取决于问题的具体需求。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值