算法思想之前缀和

server/2024/9/25 3:42:56/

前缀和:快速求出数组中某连续区间的和

一.一维前缀和(模板)

1.题目:【模板】前缀和_牛客题霸_牛客网 (nowcoder.com)

给定一个长度为n的数组a1,a2,....ana1​,a2​,....an​.,接下来有q次查询, 每次查询有两个参数l, r,对于每个询问, 请输出al+al+1+....+aral​+al+1​+....+ar​

2.算法思想

<1>预处理出一个前缀和数组

dp[i]表示[1,i]区间内所有元素的和

dp[i]=dp[i-1]+nums[i]

<2>使用前缀和数组

[l,r]区间内的元素和为dp[r]-dp[l-1]

Q:为什么下标从1开始计数呢?

A:为了处理边界情况,防止越界返回

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

4.代码实现

#include <iostream>
#include<vector>
using namespace std;int main() {int n,q;cin>>n>>q;//读入数据vector<int> nums(n+1);for(int i=1;i<=n;i++){cin>>nums[i];}//预处理一个前缀和数组vector<long long> dp(n+1);for(int i=1;i<=n;i++){dp[i]=dp[i-1]+nums[i];}//使用前缀和数组int l=0,r=0;while(q--){cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;}
}

二.二维前缀和(模板)

1.题目:【模板】二维前缀和_牛客题霸_牛客网 (nowcoder.com)

给你一个 n 行 m 列的矩阵 A ,下标从1开始。接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,

2.算法思想

<1>预处理一个前缀和矩阵

dp[i][j]表示:[1,l]和[i,j]所围成的矩阵中所有元素的和

dp[i][j]=dp[i-1][j]+dp[i][j-1]+nums[i][j]-dp[i-1][j-1]

<2>使用前缀和矩阵

矩阵内元素和为:dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]

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

4.代码实现

#include <iostream>
#include<vector>
using namespace std;int main() {int n,m,q;cin>>n>>m>>q;//读入数据vector<vector<int>> nums(n+1,vector<int>(m+1));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>nums[i][j];}}//创建一个前缀和矩阵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]+nums[i][j]-dp[i-1][j-1];}}//使用前缀和矩阵int x1=0,y1=0;int x2=0,y2=0;while(q--){cin>>x1>>y1;cin>>x2>>y2;cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;}}


http://www.ppmy.cn/server/121633.html

相关文章

【图灵完备 Turing Complete】游戏经验攻略分享 Part.6 处理器架构2 函数

新的架构来了&#xff0c;本游戏的最后一个攻略分享&#xff0c;最后汇编部分无非是对于操作码的熟练&#xff0c;硬件没有问题&#xff0c;那么也就无关痛痒了。 汇编实现&#xff0c;两数相或和两数相与非一起相与即可。 八位异或器&#xff0c;整就完事了。 有手就行。 利…

解决启动docker desktop报The network name cannot be found的问题

现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】 目录 Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】 一、简单介绍 二、适配器模式 (Adapter Pattern) 1、什么时候使用适配器模式 2、使用适配器模式的好处 3、适配器…

c/c++八股文

c基础 一、指针和引用的区别 定义方式: 指针是通过 * 操作符定义的变量,用于存储另一个变量的地址。例如: int* p &x;引用是通过 & 操作符定义的别名,直接引用另一个变量。例如: int& r x; 内存占用: 指针是一个独立的变量,占用一定的内存空间。引用不是独立的…

Spring IOC容器Bean对象管理-注解方式

目录 1、Bean对象常用注解介绍 2、注解示例说明 1、Bean对象常用注解介绍 Component 通用类组件注解&#xff0c;该类被注解&#xff0c;IOC容器启动时实例化此类对象Controller 注解控制器类Service 注解业务逻辑类Respository 注解和数据库操作的类&#xff0c;如DAO类Reso…

iOS - TestFlight使用

做的项目需要给外部人员演示&#xff0c;但是不方便获取对方设备的UDID&#xff0c;于是采用TestFlight 的方式邀请外部测试人员的方式给对方安装测试App&#xff0c;如果方便获取对方设备的UDID&#xff0c;可以使用蒲公英 1.在Xcode中Archive完成后上传App Store Connect之前…

前端算法学习,包含复杂度、双指针、滑动窗口、二叉树、堆等常见题型和方法,含leetcode例题

前端算法题 学习 复杂度 时间复杂度 代码的运行时间随着数据规模增长的趋势 最好情况的时间复杂度&#xff1a;O(1)最坏情况的时间复杂度平均情况下的时间复杂度均摊复杂度&#xff1a; 空间复杂度 双指针 两个指针同向、背向移动 快慢指针 可以用于判断链表中是否有环 …

什么是CAPTCHA?有什么用途?

一、CAPTCHA 的工作原理 CAPTCHA的核心目的是通过呈现人类可以轻松理解但计算机程序难以解决的任务&#xff0c;来阻止恶意的自动化工具。传统的CAPTCHA通过展示扭曲或模糊的文字、图片或者点击操作等&#xff0c;要求用户完成验证任务。这些任务通常需要视觉、听觉或简单的逻辑…