本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目链接:LeetCode 560. 和为K的子数组
难度:中等
一、题目描述
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
- 数组的长度为
[1, 20,000]。 - 数组中元素的范围是
[-1000, 1000],且整数 k 的范围是[-1e7, 1e7]。
二、思路分析
子数组之和的计算
思路1:直接计算,每次都需要O(n)。
思路2: 先计算前缀和,也就是代码中的sum1,sum1[i]是0~i元素之和。一次O(n),然之后,可以通过相减来快速算出某段子数组之和,O(1)。
通过字典来高效查询
如果某些i,使得0~i之和为k,即sum1[i] == k,那么统计次数+1;
如果某些i~j之和为k,那么有sum1[j]-k == sum1[i-1],可以用字典来存每个sum1[i],来提高查询效率。
三、AC 代码
Python
def subarraySum(self, nums: List[int], k: int) -> int:
# 求有多少种组合方法
sum1 = 0
preSum = defaultdict(int)
preSum[0] = 1
cnt = 0
for i in range(len(nums)): # 前缀和
sum1 += nums[i]
sum2 = sum1 - k
if sum2 in preSum:
cnt+= preSum[sum2]
preSum[sum1] += 1
return cnt
四、总结
如果需要频繁计算一个数组中的若干子数组之和,可以用前缀和来做。
如果你觉的还不错的话,给我点个赞吧💐