前缀和技巧

一、前缀和适用场景

在解题时需要快速得出数组某一区间和的时候就可以用前缀和。

二、前缀和存储形式

一维数组时,可以是大小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、寻找中心数组下标

. - 力扣(LeetCode)

4、除自身以外数组乘积

一个前缀乘加一个后缀乘数组。

5、和为k子数组

. - 力扣(LeetCode)

可以用哈希表存储 i 位置之前的前缀和和出现的次数。

循环开头先更新前缀和数组 sum += nums[i]

在 0 ~ i  范围中有结果,则上图得出的公式 ans += hash[sum[i] - k]

不要忘记一开始有一个0,hash[0] = 1

6、和可被k整除的子数组

. - 力扣(LeetCode)

注意:
(1)同余定理

(a - b)% k = 0 -> a % k == b% k

(2)防止负数取模

((a % k) + k) % k

(3)一开始0的余数是0

hash[0] = 1

依据题意,哈希表存储前缀和的余数,在哈希表中找到多少个前缀和余数等于 sum % k

7、连续数组

. - 力扣(LeetCode)

把所有的0变成-1,等于求数组中和为0的最长子数组长度。

哈希表里面存最开始前缀和的出现下标。

8、矩阵区域和

. - 力扣(LeetCode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值