前缀和差分(C/C++)

news2024/11/15 9:26:38

目录

1. 前缀和的定义

2. 一维前缀和

2.1 计算公式

2.2 用途

         2.3 小试牛刀 

3. 二维前缀和

3.1 用途


1. 前缀和的定义

对于一个给定的数列A,他的前缀和数中 S 中 S[ i ] 表示从第一个元素到第 i 个元素的总和。

如下图:绿色区域的和就是前缀和数组中的 S [ 6 ]。

 这里你可能就会有一个疑问?为什么是 S[ 6 ] 的位置,而不是 S[ 5 ] 的位置呢??即前缀和组中 S[ 0 ] 并没有参与求和的运算。这里先卖个关子等会在做解释。

2. 一维前缀和

2.1 计算公式

前缀和数组的每一项是可以通过原序列以递推的方式推出来的,递推公式就是:S[ i ] = S[  i - 1 ] + A[ i ]。S[  i - 1 ] 表示前 i - 1 个元素的和,在这基础上加上 A[ i ],就得到了前 i 个元素的和 S [ i ]。

2.2 用途

一维前缀和的主要用途:求一个序列中某一段区间中所有元素的和。有如下例子:

有一个长度为 n 的整数序列。

接下来输入 m 个询问,每个询问输入一对 l,r。

对于每个询问,输出原序列中第 l 个数到第 r 个数的和。

这边是对前缀和的应用,如果用常规的方法:从 l 到 r 遍历一遍,则需要O(N)的时间复杂度。但是有前缀和数组的话,我们可以直接利用公式:sum = S[ r ] - S[ l - 1 ],其中sum是区间中元素的总和,l 和 r 就是区间的边界。下图可帮助理解这个公式。

 当我们要求的是序列 A 的前 n 个数之和时,如果我们是从下标为 0 的位置开始存储前缀和数组,此公式:sum = S[ r ] - S[ l - 1 ] 显然就无法使用了,为了是这个公式适用于所有情况,我们将从下标为 1 的位置开始存储前缀和,并且将下标为 0 的位置初始化为 0。

 

 这便是为什么 S[ 0 ] 并未参与求和的运算。

有了上面的分析我们就能轻松解决这道题啦!

有一个长度为 n 的整数序列。

接下来输入 m 个询问,每个询问输入一对 l,r。

对于每个询问,输出原序列中第 l 个数到第 r 个数的和。

输入格式

第一行包含两个整数n和m。

第二行包含n个整数,表示整数数列。

接下来m行,每行包含两个整数l和r,表示一个询问区间的范围。

void test01()
{
	//定义数组的大小
	const int N = 100;
	//整数序列a
	int a[N] = { 0 };
	//存储前缀和的数组s,将全部元素初始化为0,即可达到将s[0]初始化为0的目的
	int s[N] = { 0 };
	
	int n, m;
	scanf("%d %d", &n, &m);

	//整数序列的输入
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		//读数据的同时利用递推式求前缀和
		s[i] = s[i - 1] + a[i];
	}

	//m个询问
	while (m--)
	{
		int l, r;
		scanf("%d %d", &l, &r);
		//利用求区间元素个数的通式计算结果
		printf("%d\n", s[r] - s[l - 1]);
	}

}

int main()
{
	//一维前缀和
	test01();

	system("pause");
	return 0;
}

 2.3 小试牛刀 

原题链接:

209. 长度最小的子数组 - 力扣(LeetCode)icon-default.png?t=N176https://leetcode.cn/problems/minimum-size-subarray-sum/

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0 。

3. 二维前缀和

和一维前缀和的原理类似,只不过二维前缀和求的是一个矩阵中所有元素的和。

 例如:对与 x = 4,y = 3 这么一组输入,就是将原矩阵序列中蓝色区域的元素相加,得到的结果便是前缀和矩阵S中 S[ 4 ][ 3 ] 的值。

3.1 用途

一维前缀和求的是某一个区间中所有元素的和,那么二维前缀和就是求一个大矩阵中某个小的矩阵中所有元素的和。

 例如上图:我们要求蓝色矩阵中所有元素的和。

 现在就差最后一步了,怎么求出前缀和矩阵中的每一个值嘞??同理利用递推关系求就阔以啦。

                            S[ i ][ j ] = S[ i - 1 ][ j ] + S[ i ][ j - 1 ] - S[ i - 1][ j - 1 ] + a[ i ][ j ]

其中a为原矩阵序列。可以尝试举一个具体的例子来理解。

有了以上知识,我们可以尝试写代码求一下。

输入一个n行m列的矩阵,在输入q个询问,每个询问包含四个整数x1,y1,x2,y2,表示一个子矩阵左上角的坐标和右下角的坐标。

对于每个询问输出子矩阵中所有数的和。

输入格式

第一行包含三个整数n,m,q

接下来n行,每行包含m个整数,表示整数矩阵。

接下来q行,每行包含四个整数x1,y1,x2,y2,表示一组询问。

void test02()
{
	//定义数组的大小
	const int N = 100;
	//原矩阵序列a
	int a[N][N] = { 0 };
	//前缀和矩阵,同样需要初始化为0,原因同一维矩阵
	int s[N][N] = { 0 };

	//读入一个n * m 的矩阵
	int n, m, q;
	scanf("%d %d %d", &n, &m, &q);
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			scanf("%d", &a[i][j]);
			//读入矩阵的同时求前缀和
			s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
		}
	}

	//q个询问
	while (q--)
	{
		int x1, y1, x2, y2;
		scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
		//利用前面推导过的公式直接打印数据即可
		printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);
	}
	printf("\n");
}


int main()
{

	//二维前缀和
	test02();

	system("pause");
	return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在SpringBoot项目上让接口返回数据脱敏,一个注解即可

1 背景需求是某些接口返回的信息&#xff0c;涉及到敏感数据的必须进行脱敏操作2 思路①要做成可配置多策略的脱敏操作&#xff0c;要不然一个个接口进行脱敏操作&#xff0c;重复的工作量太多&#xff0c;很显然违背了“多写一行算我输”的程序员规范。思来想去&#xff0c;定…

关于数字化营销技术实现之【数据埋点】

1.如何实现数据埋点&#xff1f;小程序数据埋点是指在小程序中收集用户行为数据和业务数据的一种技术手段&#xff0c;以便对用户行为和业务运营进行分析和优化。下面是一些实现小程序数据埋点的方法&#xff1a;使用小程序统计分析工具&#xff1a;小程序平台提供了统计分析工…

约束优化:低维线性时间线性规划算法(Seidel算法)、低维线性时间严格凸二次规划算法

文章目录约束优化&#xff1a;低维线性时间线性规划算法&#xff08;Seidel算法&#xff09;、低维线性时间严格凸二次规划算法带约束优化问题的定义带约束优化问题的分类及时间复杂度低维线性规划问题定义Seidel线性规划算法低维严格凸二次规划问题定义低维情况下的精确最小范…

【LeetCode】剑指 Offer 09. 用两个栈实现队列 p68 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/ 1. 题目介绍&#xff08;09. 用两个栈实现队列&#xff09; 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别…

【大厂高频必刷真题100题】《是子序列吗?》 真题练习第28题 持续更新~

是子序列吗? 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 进阶: 如果有…

火山引擎 DataTester:在广告投放场景下的 A/B 实验实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 “我知道在广告上的投资有一半是无用的&#xff0c;但问题是我不知道是哪一半。” ——零售大亨约翰沃纳梅克 这句经典名言&#xff0c;被称为广告界的哥特巴赫猜想…

Python脚本批量下载CDS气象数据

使用Python脚本从 Copernicus Climate Data Store (CDS) 检索气象数据具体地&#xff0c;需要检索变量&#xff08;geopotential、relative_humidity、temperature、u_component_of_wind、v_component_of_wind、vertical_velocity&#xff09;在各种不同的压力水平、不同的日期…

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法 情况说明: 在打开Studio 5000软件时,出现一个弹窗Log On to FactoryTalk - Network,正常情况下输入Windows账户和密码就可以登录成功。 但是却出现了下图所示窗口,其中‘abseme’是Windows账户名,‘WELL’是计算机名称,下图…

SQL零基础入门学习(二)

SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name;与 SELECT * FROM table_name;参数说明&#xff1a; column1, column2, …&#xff1a;要选择的…

向上跳空缺口选股公式,选出回补后再启动的标的

一、向上跳空缺口选股公式 思路&#xff1a;先找出缺口&#xff0c;缺口前后有两根K线&#xff0c;缺口低价是前一根K线的最高价&#xff0c;缺口高价是后一根K线的最低价。&#xff08;如上图&#xff09;收盘价低于缺口低价&#xff0c;即实现缺口回补。回补缺口之后&#xf…

“一把梭ViT”来了,谷歌提出可以灵活应对各种图像块尺寸的FlexiViT

原文链接&#xff1a;https://www.techbeat.net/article-info?id4486 作者&#xff1a;seven_ 论文链接&#xff1a; https://arxiv.org/abs/2212.08013 代码链接&#xff1a; https://github.com/google-research/big_vision 视觉Transformer&#xff08;ViT&#xff09;目前…

Linux - 第4节 - Linux进程控制

1.进程创建 1.1.fork函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。#include <unistd.h> pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&…

考虑泄流效应的光伏并网点电压系统侧增援调控方法matlab

目录 1主要内容 1.1 泄流效应​编辑 1.2 候选无功补偿站优选方法 1.3 算法步骤 2部分代码 3程序结果 4程序链接 1主要内容 程序主要复现《考虑泄流效应的风电场并网点电压系统侧增援调控方法_于其宜》&#xff0c;将光伏取代风电&#xff0c;考虑某时刻光伏并网的电压增…

3年工作之后是不是还在“点点点”,3年感悟和你分享....

经常都有人问我软件测试前景怎么样&#xff0c;每年也都帮助很多朋友做职业分析和学习规划&#xff0c;也很欣慰能够通过自己的努力帮到一些人进入到大厂。 2023年软件测试行业的发展现状以及未来的前景趋势 最近很多测试人在找工作的时候&#xff0c;明显的会发现功能测试很…

死磕JAVA10余年!手写“Java核心技能精选”Github一夜疯涨30w+

写在前面 想在面试、工作中脱颖而出&#xff1f;想在最短的时间内快速掌握 Java 的核心基础知识点&#xff1f;想要成为一位优秀的 Java 工程师&#xff1f;本篇文章能助你一臂之力&#xff01; 很多同学对一些新技术名词都能侃侃而谈&#xff0c;但对一些核心原理理解的不够…

很好用的 UI 调试技巧

文章目录 UI调试效果(一)评论最后UI调试小姑(二)参考文档 很好用的 UI 调试技巧 UI调试效果(一) javascript: (function() {const style = document<

RT-Thread初识学习-02

课程链接 02-RT-Thread介绍_哔哩哔哩_bilibili 学习方法 使用官方资料进行学习&#xff0c;并且在学习的过程中与FreeRTOS进行比较 RT-Thread API参考手册: 基础定义 标准版RTT移植 这里的串口2是由于打印信息的&#xff0c;因此你需要在开发板上选择USB-TTL串口&#xff0…

什么是品牌控价?品牌控价的意义是什么?品牌控价合不合法

很多人不明白为什么要控价&#xff0c;今天我们就来聊一聊品牌控价。 一、 什么是控价 顾名思义&#xff0c;“控价”就是管控价格&#xff0c;将价格控制在合理的范围以内。 品牌方生产出产品&#xff0c;要以一定的价格投入市场。而市场中的实际成交价格会受渠道各因素的影…

Kubernetes二 Kubernetes之实战以及pod详解

Kubernetes入门 一 Kubernetes实战 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 1.1 Namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。…

pmp考试是什么?适合哪些人学?含金量?(含pmp资料)

先说一下我这个人的理解&#xff0c;PMP就是提高项目管理理论基础和实践能力的考试。 再说说PMP官方一点的说明&#xff1a; PMP证书全称为Project Management Professional&#xff0c;也叫项目管理专业人士资格认证。PMP证书由美国项目管理协会(PMI)发起&#xff0c;是严格…