s[j]−s[i]=k
=>
s[i]=s[j]−k 遍历 s,一边枚举右边的 j,一边用哈希表统计左边有多少个 i 满足 i<j 且 s[i]=s[j]−k。
比如 s[j]=2,那么 s[i]=s[j]−k=2−1=1,我们要找的是 j 左边有多少个 s[i]=1。
前缀和
python
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
s = [0] * (len(nums) + 1)
for i, x in enumerate(nums):
s[i + 1] = s[i] + x
ans = 0
cnt = defaultdict(int)
for sj in s:
si = sj - k
ans += cnt[si]
cnt[sj] += 1
return ans