首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【数据结构与算法】前缀和

【数据结构与算法】前缀和

作者头像
风中的云彩
发布于 2025-05-22 00:43:54
发布于 2025-05-22 00:43:54
7200
代码可运行
举报
文章被收录于专栏:C/C++的自学之路C/C++的自学之路
运行总次数:0
代码可运行

前言

这是我自己学习蓝桥杯算法的第四篇博客总结。 上一期笔记是关于二分查找算法,没看的同学可以过去看看: 【数据结构与算法】二分查找_.二分查找c++-CSDN博客

https://cloud.tencent.com/developer/article/2519670

技巧

一维数组前缀和

前缀和算法快速求出数组中某一连续区间的和。 原来的数组为numsn,新创建一个前缀和数组dpn,则有dpi=dpi-1+numsi。 如果原来的数组下标是从1开始,那么前缀和数组下标也从1开始,可以避免处理边界条件前缀和也可以变形成后缀和

二维数组前缀和

前缀和算法快速求出数组中某一矩阵区间的和。 原来的数组为numsn,新创建一个前缀和数组dpn,则有dpn=dpn-1+dpn+numsn-dpn-1。 如果原来的数组下标是从1开始,那么前缀和数组下标也从1开始,可以避免处理边界条件

例题

nowcoder-dp34题:undefined【模板】前缀和_牛客题霸_牛客网

https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId=230&tqId=2021480&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

int main()
{
    int n=0,m=0,l=0,r=0;
    long long arr[100001]={0};
    long long dp[100001]={0};
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>arr[i];
    for(int i=1;i<=n;i++)
        dp[i]=dp[i-1]+arr[i];
    while(m--)
    {
        cin>>l>>r;
        cout<<dp[r]-dp[l-1]<<endl;
    }
    return 0;
}

nowcoder-dp35题:undefined【模板】二维前缀和_牛客题霸_牛客网

https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc?tpId=230&tqId=2023819&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

int main() 
{
    int n=0,m=0,q=0;
    long long nums[2000][2000]={0};
    long long dp[2000][2000]={0};
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cin>>nums[i][j];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+nums[i][j];
    }
    while(q--)
    {
        int x1=0,y1=0,x2=0,y2=0;
        cin>>x1>>y1>>x2>>y2;
        long long ret=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
        cout<<ret<<endl;
    }
    return 0;
}

leetcode-724题:undefined724. 寻找数组的中心下标 - 力扣(LeetCode)

https://leetcode.cn/problems/find-pivot-index/description/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int pivotIndex(vector<int>& nums) 
    {
        int left=0,right=nums.size(),cur=0;
        int dp[20000]={0};
        dp[0]=nums[0];
        for(int i=1;i<right;i++)
        {
            dp[i]=dp[i-1]+nums[i];
        }
        while(cur<right)
        {   
            if(cur==0&&0==dp[right-1]-dp[cur])
                return 0;
            else if(cur!=0&&dp[cur-1]==dp[right-1]-dp[cur])
                return cur;
            else
                cur++;
        }
        return -1;
    }
};

leetcode-238题:undefined238. 除自身以外数组的乘积 - 力扣(LeetCode)

https://leetcode.cn/problems/product-of-array-except-self/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        int end=nums.size()-1;
        vector<int> dp_front(nums.size(),0);
        vector<int> dp_back(nums.size(),0);
        vector<int> answer(nums.size(),0);
        dp_front[0]=nums[0];
        dp_back[end]=nums[end];
        for(int i=1;i<=end;i++)
            dp_front[i]=dp_front[i-1]*nums[i];
        for(int i=end-1;i>=0;i--)
            dp_back[i]=dp_back[i+1]*nums[i];
        answer[0]=dp_back[1];
        answer[end]=dp_front[end-1];
        for(int i=1;i<end;i++)
            answer[i]=dp_front[i-1]*dp_back[i+1];
        return answer;
    }
};

leetcode-560题560. 和为 K 的子数组 - 力扣(LeetCode)

https://leetcode.cn/problems/subarray-sum-equals-k/description/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) 
    {
        unordered_map<int,int> m;
        m[0]=1;
        int count=0,i=0,sum=0;
        while(i<nums.size())
        {
            sum+=nums[i];
            int remainder=sum-k;
            if(m.find(remainder)!=m.end())
                count+=m[remainder];
            m[sum]++;
            i++;
        }
        return count;
    }
};

leetcode-974题974. 和可被 K 整除的子数组 - 力扣(LeetCode)

https://leetcode.cn/problems/subarray-sums-divisible-by-k/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) 
    {
        unordered_map<int,int> m;
        m[0]=1;
        int sum=0,i=0,count=0;
        while(i<nums.size())
        {
            sum+=nums[i];
            int remainder=(sum%k+k)%k;
            if(m.find(remainder)!=m.end())
                count+=m[remainder];
            m[remainder]++;
            i++;
        }
        return count;
    }
};

leetcode-525题525. 连续数组 - 力扣(LeetCode)

https://leetcode.cn/problems/contiguous-array/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int findMaxLength(vector<int>& nums) 
    {
        unordered_map<int,int> m;
        int length=0,i=0,sum=0;
        m[0]=0;
        while(i<nums.size())
        {
            if(nums[i]==0)
                sum+=-1;
            else
                sum+=1;
            if(m.find(sum)!=m.end())
                length=max(length,i+1-m[sum]);
            else
                m[sum]=i+1;
            i++;
        }
        return length;
    }
};

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法专题四: 前缀和
根据题意, 创建一个前缀和数组, dp[i] = dp[i -1] + arr[i], 再使用前缀和数组, 要求的区域ret = dp[r] - dp[l-1], 这里我们为什么要这样求dp[i]呢? 还要绕一大圈子, 直接相加不就行了 , 但是如果直接相加求还不如我们的暴力解法呢, 这里还要开辟空间, 但是我们使用dp[i]求解只需遍历一遍数组即可求出前缀和
用户11317877
2024/10/16
1100
算法专题四: 前缀和
算法思想总结:前缀和算法
小陈在拼命
2024/03/23
1350
算法思想总结:前缀和算法
【C++】前缀和算法专题
⽤ dp[i] 表⽰: [1, i] 区间内所有元素的和,那么 dp[i - 1] ⾥⾯存的就是 [1,i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] +arr[i] ;
啊QQQQQ
2024/11/19
1300
【C++】前缀和算法专题
【算法刷题指南】前缀和
南桥
2024/12/14
1210
【算法专题】前缀和
题目:给定一个长度为n的数组 a1​, a2​, …an. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出 al + al + 1 + … + ar
YoungMLet
2024/03/01
1770
【算法专题】前缀和
【数据结构与算法】模拟
https://blog.csdn.net/hsy1603914691/article/details/147953256?sharetype=blogdetail&sharerId=147953256&sharerefer=PC&sharesource=hsy1603914691&spm=1011.2480.3001.8118
风中的云彩
2025/05/28
590
【算法篇】前缀和
用户11029103
2025/01/15
930
【算法篇】前缀和
算法之【前缀和】讲解
前缀和的核心就是在求前缀和数组和如何使用前缀和数组的公式,更重要的是前缀和的思想,不能死记模板~
用户11316056
2024/10/16
1070
算法之【前缀和】讲解
【算法】——前缀和(矩阵区域和详解,文末附)
三三是该溜子
2024/12/30
1470
【算法】——前缀和(矩阵区域和详解,文末附)
初识算法 · 前缀和(1)
​本文的主题是前缀和,通过两道题目讲解,一道是一维数组的模板,一道是二维数组的模板。 链接分别为: 【模板】前缀和_牛客题霸_牛客网 【模板】二维前缀和_牛客题霸_牛客网 题目分为三个部分讲解,一是题目解析,二是算法原理,三是算法编写,那么,话不多说,直接进行主题咯。
_lazy
2024/11/19
1060
初识算法 · 前缀和(1)
基础算法---前缀和
前缀和的用处:前缀和数组求出来之后我们就可以就可以求数组中的某个特定区间的和
用户11305458
2024/10/09
1760
基础算法---前缀和
【刷题】前缀和进阶
今天我们继续加强对前缀和算法。 前缀和算法是对数组进行预处理操作,进而避免大量重复的操作!使得算法性能增强! 适用于对数组有大量重复操作的问题,一维预处理较简单,二维比较复杂,画图分析可以顺利解决!
叫我龙翔
2024/05/11
1520
【刷题】前缀和进阶
leetcode560题解【前缀和+哈希】
在解决这道题前需要先清楚,一个和为k的子数组即为一对前缀和的差值【这句话摘自链接】
_DIY
2020/09/22
5000
leetcode560题解【前缀和+哈希】
【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影
给定一个长度为 n 的整数数组 arr 和 q 个查询,每个查询由两个整数 l 和 r 组成,表示区间 [l, r]。请计算出每个区间内所有元素的和。
半截诗
2025/05/29
1180
【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影
【算法】前缀和问题
本题中的 dp[i] 表示的是 i 位置之前的前缀和,不包括 i 位置,所以 dp 表要多开一个位置,而且还要注意循环的区间。
_小羊_
2025/03/29
1430
【算法】前缀和问题
【刷题】前缀和入门
☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆
叫我龙翔
2024/04/25
1010
【刷题】前缀和入门
深度解析算法之前缀和
这个题的话就是下面的样子,我们第一行输入 3 2的意思即是这个数组是3个元素大小的数组,2是接下来我们是需要输入两行数据下标的 然后第二行我们输入的n个整数表示的就是我们数组中的元素 然后后面的2行就是我们想计算数组中从哪里到哪里的和 这里的话我们是第一个数到第二个数的和,那么我们这里的就是3了
Undoom
2025/04/21
820
深度解析算法之前缀和
LeetCode 327. 区间和的个数(multiset二分查找/归并排序)
给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。
Michael阿明
2020/07/13
7990
【算法】前缀和、模拟、位运算、差分
先把所有的数加起来,在这个过程之中把偶数放到堆中,在遍历这个全是偶数的堆k次,每次让所有数之和减去最大偶数的一半,如果最大偶数除2后还是偶数还要重新添加到堆中,在这个过程中还要关注堆是否已经空了。
_小羊_
2025/03/15
600
【算法】前缀和、模拟、位运算、差分
我爱学算法之—— 前缀和(中)
遍历到i位置时,判断该位置是否是中心下标,也就是该位置左侧所有元素是否等于右侧所有元素。
星辰与你
2025/06/08
600
我爱学算法之—— 前缀和(中)
相关推荐
算法专题四: 前缀和
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验