前缀和算法习题篇(上)

1.一维前缀和

题目描述:

解法一:暴力解法:模拟

时间复杂度是O(n*q),会超时。

解法二:前缀和解法:快速求出数组中某一个连续区间的和

快速是指O(1),前缀和思想可把时间复杂度可降到O(q)。

算法思路:
  1. 先预处理出来一个前缀和数组:O(n)
  • dpi 表示: 1, i 区间内所有元素的和,那么 dpi - 1 里面存的就是 1, i - 1 区间内所有元素的和。
  • 递推公式: dpi = dpi - 1 + arri
  1. 使用前缀和数组,快速求出某一个区间内所有元素的和:O(q)
  • 当询问的区间是 l, r 时:区间内所有元素的和为: dpr - dpl - 1

时间复杂度为O(q)+O(n).

为什么我们的下标要从1开始计数呢?

举例:当访问的区间是0,2时,区间内所有元素的和为dp2-dp-1,这里的dp-1越界。而当访问的区间是1,2时,区间内所有元素的和为dp2-dp0,使dp0=0即可,不会越界。

  • 为了处理边界情况
  • 初始化:添加虚拟结点(辅助结点)
代码实现:
cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

int main() 
{
   //1.读入数据
   int n,q;
   cin>>n>>q;
   vector<int> arr(n+1);
   for(int i=1;i<=n;i++) cin>>arr[i];

   //2.预处理出来一个前缀和数组
   vector<long long> dp(n+1);//防止溢出
   for(int i=1;i<=n;i++) dp[i]=dp[i-1]+arr[i];

   //3.使用前缀和数组
   int l=0,r=0;
   while (q--) 
   {
        cin>>l>>r;
        cout<<dp[r]-dp[l-1]<<endl;
   }
   return 0;
}

2.二维前缀和

题目描述:


解法一:暴力解法:模拟

时间复杂度是O(n* m *q),会超时。

解法二:前缀和解法

算法思路:

1.预处理出来一个前缀和矩阵: O(m*n)

  • dp[i][j]表示:从[1,1]位置到[i,j]位置,这段区间里面所有元素的和。

2.使用前缀和矩阵 : O(q)

时间复杂度为O(m*n)+O(q).

代码实现:
cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

int main() 
{
    //1.读入数据
    int n=0,m=0,q=0;
    cin>>n>>m>>q;
    vector<vector<int>> arr(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>arr[i][j];

    //2.预处理前缀和矩阵
    vector<vector<long long>> dp(n+1,vector<long long>(m+1));//防止溢出
    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]+arr[i][j]-dp[i-1][j-1];

    //3.使用前缀和矩阵
    int x1=0,y1=0,x2=0,y2=0;
    while (q--) 
    {
        cin>>x1>>y1>>x2>>y2;
        cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;
    } 
    return 0;         
}

最后,本篇文章到此结束,感觉不错的友友们可以一键三连支持一下笔者,有任何问题欢迎在评论区留言哦~

相关推荐
可编程芯片开发1 小时前
基于霍尔传感器和PID控制器的有功功率检测控制系统simulink建模与仿真
算法
To_OC1 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
blueman88882 小时前
Qt5通过vcpkg中调用时,在debug模式下调试时总是调用release的plugins文件夹中的dll
c++·qt·cmake
战族狼魂4 小时前
GPT-5.6与Grok 4.5重磅发布
人工智能·算法·大模型·大语言模型
白日焰火14 小时前
基于 OpenSpec 实现规范驱动开发
算法·交互
jinyishu_4 小时前
C++ string使用方法
开发语言·c++
imuliuliang4 小时前
关于图搜索算法的性能建模与可预测性研究7
算法
乐观勇敢坚强的老彭5 小时前
C++浮点数使用注意事项
开发语言·c++
库克克5 小时前
【C++ 】内联函数
java·开发语言·c++
盐焗鹌鹑蛋5 小时前
【C++】红黑树
c++