C++前缀和介绍
前缀和的概念
前缀和(Prefix Sum)是一种预处理技术,用于快速计算数组区间和。其核心思想是通过预处理生成一个前缀和数组,使得区间和查询的时间复杂度从O(n)优化为O(1)。
前缀和的实现
- 预处理前缀和数组
给定数组nums
,其前缀和数组prefix
定义为:prefix[0] = 0
prefix[i] = prefix[i-1] + nums[i-1]
(i ≥ 1)
vector<int> prefixSum(vector<int>& nums) {int n = nums.size();vector<int> prefix(n + 1, 0);for (int i = 1; i <= n; ++i) {prefix[i] = prefix[i - 1] + nums[i - 1];}return prefix;
}
- 区间和查询
利用前缀和数组,区间[l, r]
的和可通过以下公式计算:
sum = prefix[r + 1] - prefix[l]
int rangeSum(vector<int>& prefix, int l, int r) {return prefix[r + 1] - prefix[l];
}
应用场景
- 频繁区间求和:如多次查询数组子数组的和。
- 动态数据统计:结合差分数组处理动态区间更新。
- 多维扩展:二维前缀和用于矩阵区域求和(如LeetCode 304)。
复杂度分析
- 预处理时间:O(n)
- 查询时间:O(1)
- 空间复杂度:O(n)
示例代码
以下为完整示例,展示前缀和的构建与查询:
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums = {1, 3, 5, 7, 9};vector<int> prefix = prefixSum(nums);// 查询区间[1, 3]的和(即3 + 5 + 7 = 15)cout << rangeSum(prefix, 1, 3) << endl; // 输出15return 0;
}