题目
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。
思路
1.滑动窗口
这道题我一开始想到的是用滑动窗口方法,但是题目里表明了nums[i]的范围,里面包含了负数,所以并不能使用滑动窗口。
2.枚举
我们可以通过枚举[0…i]中所有的下标是否存在符合题意的子数组。
count=0
for right in range(len(nums)):
s=0
for left in range(right,-1,-1):
s+=nums[left]
if s==k:
count+=1
return count
但是python这样写会超时!!!
3.前缀和+哈希表
于是来到了第三种方法。。只需遍历一次,利用哈希表记录所有下标的前缀和。如果s-k存在在哈希表中,那么说明前面存在counter[s-k]个子数组满足题目。
完整代码如下
完整代码
def subarraySum(self, nums: List[int], k: int) -> int:
count=0
s=0
counter={0:1}
for i in range(len(nums)):
s+=nums[i]
if s-k in counter:
count+=counter[s-k]
if s in counter:
counter[s]+=1
else:
counter[s]=1
return count