一、前缀和适用场景
在解题时需要快速得出数组某一区间和的时候就可以用前缀和。
二、前缀和存储形式
一维数组时,可以是大小n + 1的数组,预留一个和是0的位置。
一维数组还可以用哈希表存储在下标 i 位置之前的所有前缀和,这样快速查找。
二维或多维数组建议预留一维0
三、前缀和普遍公式
1、一维前缀和
预留0位置,i 从1开始,dp数组下标 - 1对应原数组下标
dp[i] = dp[i - 1] + nums[i - 1]
2、二维前缀和
(1)初始化前缀和数组
dp[x2][y2] = dp[x1 - 1][y2] + dp[x2][y1 - 1] + nums[x2][y2] - dp[x1 - 1][x2 - 1]
(2)使用前缀和数组
得到(x1, y1)到(x2, y2)中间所有数的和
ans = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]
四、例题
1、一维数组q次查询
注意两数相加溢出问题
2、二维数组q次查询
3、寻找中心数组下标
4、除自身以外数组乘积
一个前缀乘加一个后缀乘数组。
5、和为k子数组
可以用哈希表存储 i 位置之前的前缀和和出现的次数。
循环开头先更新前缀和数组 sum += nums[i]
在 0 ~ i 范围中有结果,则上图得出的公式 ans += hash[sum[i] - k]
不要忘记一开始有一个0,hash[0] = 1
6、和可被k整除的子数组
注意:
(1)同余定理
(a - b)% k = 0 -> a % k == b% k
(2)防止负数取模
((a % k) + k) % k
(3)一开始0的余数是0
hash[0] = 1
依据题意,哈希表存储前缀和的余数,在哈希表中找到多少个前缀和余数等于 sum % k
7、连续数组
把所有的0变成-1,等于求数组中和为0的最长子数组长度。
哈希表里面存最开始前缀和的出现下标。