前缀和(C++)

算法的种类很多,虽然我目前掌握的不多,但是在我浅薄的认知里,我把算法分为两类。
一类是小算法,比如前缀和与快速幂这种,为什么说它们是小算法呢,因为,它们的用法比较单一,不算是一种庞大的思想,一般不能决定整个算法的走向,而是为降低程序时间复杂度的一个小操作,一种锦上添花的小装饰。
另一类是大算法,比如贪心和动态规划这种,这种算法直接关系到解决某个问题的全局思想,出现的形式多样,运用起来也比较灵活。
哈哈,废话不再多说,来解释一下前缀和吧~

定义

前缀和(Prefix sum)就是,对于一个给定数组a,它的前缀和数列是s[i]=(从a[0]+a[1]+…a[i])(其实是一种预处理的思想吧)

前缀和的最典型应用就是求数组某个子段的和

由于时间复杂度非常低,仅为O(1),所以得到了广泛的应用

一维前缀和定义

举个小栗子吧~
一个长度为n的数组a,求第l个元素到第r个元素的和

//by LMY
int a[50] = {0}, s[50] = {0}, i, l, r, n;
//a是原数组,s是前缀和数组
	cin >> n;
	cin >> l >> r;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i];
		s[i] = s[i - 1] + a[i];
		//这一步是前缀和数组的构建
	}
	cout << s[r] - s[l - 1] << "\n";
	//求子数组的和
二维前缀和定义
//二维前缀和
//把s[0][i]和s[i][0]全部置为0
//s[i-1][j-1]加重复了,需减去
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

不要忘记对原始数组初始化哦,因为使用前缀和是往往是从a[1]开始的,要把a[0]初始化为0的鸭~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值