题目描述:
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
解题思路1:
双指针解法,但最后超出了时间限制
代码1:
class Solution(object):
def subarraySum(self, nums, k):
number = 0
for i in range(len(nums)):
if nums[i] == k:
number += 1
for i in range(len(nums)-1):
sum = nums[i]
for j in range(i+1, len(nums)):
sum += nums[j]
if sum == k:
number += 1
# if sum > k: # 注释掉是因为同时出现正数和负数时,其和可能满足条件
# break
return number
解题思路2:
字典+前缀和
代码2:
import collections
class Solution(object):
def subarraySum(self, nums, k):
num_times = collections.defaultdict(int)
num_times[0] = 1 # 先给定一个初始值,代表前缀和为0的出现了一次
cur_sum = 0 # 记录到当前位置的前缀和
res = 0
for i in range(len(nums)):
cur_sum += nums[i] # 计算当前前缀和
if cur_sum - k in num_times:
res += num_times[cur_sum - k]
num_times[cur_sum] += 1
return res
参考链接:
题目来源: