刷题记录 HOT100 子串-1:560. 和为 K 的子数组
题目:560. 和为 K 的子数组
难度:中等
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
一、模式识别
数组 and 连续子数组 and 求和 》 前缀和(子串)
前缀和:遍历数组并求和,记录所有出现过的求和(哈希表),
target == 从i到j的求和 = 从0到j的求和 - 从0到i的求和
则有:从0到i的求和 = 从0到j的求和 - target
所以程序只要实现每遍历到一个元素只需要从哈希表中找从0到j的求和 - target便可以实现功能
回归哈希表的本质:用空间换时间
二、代码实现
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
cache = defaultdict(int)
cache[0] = 1
sumAll = 0
ans = 0
for num in nums:
sumAll += num
if sumAll - k in cache:
ans += cache[sumAll - k]
cache[sumAll] += 1
return ans