前缀和(求解指定区间和)
算法原理
下列数组下标都是从1开始
原数组nums 0 1 3 5 7 9
前缀和sum 0 1 4 9 16 25
sum[3]-sum[1] 就是num[2]+nums[3]
int getSum(int l, int r, vector<int>& sum){
return sum[r] - sum[l-1];
}
算法模板,推荐算法2
vector<int> nums = {1,2,3};
vector<int> sum{0};
for(int a: nums){
sum.push_back(sum.back()+a);
}
int getSum(int l, int r, vector<int>& sum){
return sum[r] - sum[l-1];
}
vector<int> nums = {0, 1, 2, 3};
vector<int> sum(nums.size());
for (int i = 1; i < nums.size(); i++) {
sum[i] = nums[i] + sum[i-1];
}
int getSum(int l, int r, vector<int>& sum){
return sum[r] - sum[l-1];
}
vector<int> nums = {1, 2, 3};
vector<int> sum(nums.size()+1);
for (int i = 1; i <= nums.size(); i++) {
sum[i] = nums[i-1] + sum[i-1];
}
int getSum(int l, int r, vector<int>& sum){
return sum[r] - sum[l-1];
}
差分(求解区间加减问题)
差分原理
下列数组下标都是从1开始,区间[1,n]
原数组nums 0 1 3 5 7 9
差分数组dif 0 1 2 2 2 2
差分数组前缀和sum 0 1 3 5 7 9
刚好还原数组
如果要把[1,3]区间数组都加1,只需要dif[1]+1, dif[4]-1
差分数组dif 0 2 2 2 1 2
差分数组前缀和sum 0 2 4 6 7 9
int add(int l, int r, int val, vector<int> &dif) {
dif[l] += val;
dif[r + 1] -= val;
}
差分代码
vector<int> nums = {0, 1, 3, 5, 7, 9};
vector<int> dif(nums.size());
for (int i = 1; i < nums.size(); i++) {
dif[i] = nums[i] - nums[i-1];
}
int add(int l, int r, int val, vector<int> &dif) {
dif[l] += val;
dif[r + 1] -= val;
}
int recover(vector<int>& dif, vector<int>& nums){
for(int i = 1; i < nums.size(); i++) {
nums[i] = nums[i-1] + dif[i];
}
}