差分数组和前缀和代码随想录
时间: 2025-05-29 17:31:40 浏览: 18
### 差分数组与前缀和算法详解
差分数组是一种用于高效处理区间加减操作的数据结构,而前缀和则常用来快速计算子数组的和。两者密切相关,在实际应用中有广泛用途。
#### 差分数组概念及其实现
差分数组的核心思想是对原始数组进行预处理,使得后续对区间的修改更加高效。给定一个数组 `arr`,它的差分数组定义如下:
- **差分数组**中的第 \(i\) 个元素等于原数组中第 \(i\) 个元素与其前一元素之差。
具体来说,如果原数组为 `[a_0, a_1, ..., a_{n-1}]`,那么对应的差分数组为:
\[ \text{diff}[i] = \begin{cases}
\text{arr}[0], & i=0 \\
\text{arr}[i]-\text{arr}[i-1], & 1 \leq i < n
\end{cases} \]
通过上述方式构建差分数组后,可以通过对其求前缀和恢复原始数组[^1]。
以下是基于 C++ 的差分数组实现代码示例:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 构建差分数组函数
vector<int> buildDifferenceArray(const vector<int>& arr) {
int n = arr.size();
vector<int> diff(n);
diff[0] = arr[0];
for(int i = 1; i < n; ++i){
diff[i] = arr[i] - arr[i-1]; // 计算差分值
}
return diff;
}
// 还原原始数组函数
vector<int> restoreOriginalArray(const vector<int>& diffArr) {
int n = diffArr.size();
vector<int> original(n);
original[0] = diffArr[0];
for(int i = 1; i < n; ++i){
original[i] = original[i-1] + diffArr[i]; // 求前缀和还原
}
return original;
}
```
#### 前缀和的应用场景及其代码实现
前缀和主要用于加速查询任意子数组的和的操作。假设有一个长度为 \(n\) 的数组 `arr`,我们可以预先计算出该数组的一个辅助数组——前缀和数组 `prefixSum`,其中每个位置存储的是到当前位置为止所有元素的累加和。
对于索引范围从 \(l\) 到 \(r\) 的子数组,其总和可以直接由下述关系得出:
\[ \text{sum}(l,r)=\text{prefixSum}[r]-\text{prefixSum}[l-1]\quad (\text{当}\ l > 0)\ ]
或者简单地写成:
\[ \text{sum}(l,r)=\text{prefixSum}[r]\quad(\text{当}\ l=0)\ ]
下面是 Python 版本的前缀和实现例子:
```python
def prefix_sum(arr):
n = len(arr)
pre_sum = [0]*n
pre_sum[0] = arr[0]
for i in range(1,n):
pre_sum[i] = pre_sum[i-1]+arr[i] # 累计求和
return pre_sum
# 测试用例
array_test = [1,2,3,4,5]
pre_sums = prefix_sum(array_test)
print(pre_sums) #[1, 3, 6, 10, 15]
```
#### 结合《代码随想录》的理解
在《代码随想录》这本书里提到过很多经典题目都涉及到了这两种技巧的实际运用情况。比如移除重复项问题就间接利用了这些方法来优化性能表现[^4]。书中强调理解并掌握基本数据结构以及常见算法模式的重要性,这对于解决更复杂的挑战非常有帮助。
阅读全文
相关推荐
















