【C++】前缀和算法专题

目录

介绍

【模版】一维前缀和

算法思路:

代码实现

【模版】二维前缀和

算法思路

代码实现

寻找数组中心的下标

算法思路

代码实现

总结

除自身以外数组的乘积

算法思路

代码实现

和为K的子数组

算法思路

代码实现

和可被整除的K的子数组

算法思想

代码实现

连续数组

算法思想

代码实现

总结

矩阵区域和

算法思想

代码实现

总结


介绍

前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。 

 

【模版】一维前缀和

模版前缀和【模板】前缀和_牛客题霸_牛客网

算法思路:

a. 先预处理出来⼀个「前缀和」数组:
dp[i] 表⽰: [1, i] 区间内所有元素的和,那么 dp[i - 1] ⾥⾯存的就是 [1,i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] +arr[i] ;
b. 使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的和:当询问的区间是 [l, r] 时:区间内所有元素的和为: dp[r] - dp[l - 1]

代码实现

#include<iostream>
#include<vector>
using namespace std;


int main()
{
    int n;cin>>n;
    vector<int>s(n+1);
    int q=0;cin>>q;
    for(int i=1;i<=n;i++)cin>>s[i];
    vector<long long>dp(n+1);//防止数据溢出
    for(int i=0;i<=n;i++)
    dp[i]=dp[i-1]+s[i];
    while(q--)
    {
        int r=0,l=0;
        cin>>r>>l;
        cout<<dp[l]-dp[r-1]<<endl;
    }
    return 0;
}

【模版】二维前缀和

【模版二维前缀和】【模板】二维前缀和_牛客题霸_牛客网

算法思路

类⽐于⼀维数组的形式,如果我们能处理出来从 [0, 0] 位置到 [i, j] 位置这⽚区域内所有
元素的累加和,就可以在 O(1) 的时间内,搞定矩阵内任意区域内所有元素的累加和。因此我们接下来仅需完成两步即可:
第⼀步:搞出来前缀和矩阵
这⾥就要⽤到⼀维数组⾥⾯的拓展知识,我们要在矩阵的最上⾯和最左边添加上⼀⾏和⼀列0,这样我们就可以省去⾮常多的边界条件的处理(同学们可以⾃⾏尝试直接搞出来前缀和矩阵,边界条件的处理会让你崩溃的)。处理后的矩阵就像这样:
这样,我们填写前缀和矩阵数组的时候,下标直接从 1 开始,能⼤胆使⽤ i - 1 , j - 1 位置的值。
注意 dp 表与原数组 matrix 内的元素的映射关系:
i. dp 表到 matrix 矩阵,横纵坐标减⼀;
ii. matrix 矩阵到 dp 表,横纵坐标加⼀。
前缀和矩阵中 sum[i][j] 的含义,以及如何递推⼆维前缀和⽅程
a. sum[i][j] 的含义:
sum[i][j] 表⽰,从
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值