给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
暴力法
直观的解法是暴力法,但暴力法的复杂度是N3, 前两重for循环是快慢指针遍历每一个子数组,第三个for循环是求和。
改进的暴力法:巧用前缀和
前缀和问题已经不止出现一次了。如果我们记录了前i个数字的和,那么求(j,i)这一段的和就只用一次减法。我们可以把时间复杂度降低至N2.
哈希表: On的解法
如果我们用哈希表记录前缀和出现的次数,如果pre[i] -k出现在哈希表中,其实我们就找到了和为k的子数组,且次数就是cnt[pre[i]-k]
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
rec = {}
pre = 0
count = 0
rec[0] = 1
for n in nums:
pre += n
if pre - k in rec:
count += rec[pre-k]
if pre in rec:
rec[pre] += 1
else:
rec[pre] = 1
return count