菜姬的算法小课堂开课了!!!今天,菜姬老师给大家讲的内容是“前缀和”。
"前缀和" 的定义:数列的前 n 项的和。
前缀和是一种重要的预处理,能大大降低查询的时间复杂度。 我们可以简单理解为 "数列的前 n 项的和"。 这个概念其实很容易理解,即一个前缀和数组中,第 n 位存储的是原数组前 n 个数字的和。
在这里我默认大家对高中的数学基本知识还有印象,那么前缀和以高中学的数列来表示就是
当然,在编程里我们不需要记忆什么求和公式,而且基本上所有前缀和(一维)的求解形式都是一样的。
形式来讲,假如我们有一个长度为 n 的数组 a,数组 a 的每一项都有一个初始值,那么求解这个数组的前缀和方式为:
使用 for 循环从前往后遍历,对于当前下标 x,我们需要进行 a[x] += a[x - 1] 操作,这样循环下来就能取得数组的前缀和数组,通俗来说对于一个初始的数组,如果我们需要求解前缀和数组第 x 项,那么这个第 x 项显然值为原数组 a 的前 x 项和,即我们求解时可以用原数组 a 前 x - 1 项和加上我们 a 数组第 x 项。
当然以上求出的前缀和数组会覆盖原数组 a,如果大家想保留原数组我们可以用新数组 S 代表前缀和数组。同理,求解 S 的方式类似,我们只需要令 S[x] = S[x - 1] + a[x],需要注意的是 S1 = a1。
总而言之,本节并不是想让大家具体掌握前缀和知识,只是想提前让大家了解一下。因此,我们的问题相对来说会很简单。那么来让我们练练手吧:
假设我们有一个长度为 n 的数组,请求出数组的前缀和数组,并输出每一项。
第一行输入一个 n ( 1 ≤ n ≤ 105 )
接下来有 n 行,每一行输入一个整数 ai
保证
4
1
1
1
1
1
2
3
4