Skip to content

Latest commit

 

History

History
38 lines (28 loc) · 1.36 KB

560-subarray-sum-equals-k.md

File metadata and controls

38 lines (28 loc) · 1.36 KB

给定一个整数数组和一个整数 k,你需要找到该数组中和为 的连续的子数组的个数。

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明 :

  1. 数组的长度为 [1, 20,000]。
  2. 数组中元素的范围是 [-1000, 1000] ,且整数 的范围是 [-1e7, 1e7]。

Solutions

这个问题有点类似于 327. 区间和的个数,但是其实更简单。

和为 K 的子数组,用前缀和,在遍历计算前缀和的时候,缓存前面前缀和出现的次数。假设当前遍历到 j 位,前面又 i1, i2 前缀和满足 pre[j] - pre[i] = k。出现次数就是 j 为右边界可以组成满足条件的子数组个数。

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        cache = {0: 1}
        pre, cnt = 0, 0
        for n in nums:
            pre += n
            cnt += cache.get(pre-k, 0)
            if pre not in cache:
                cache[pre] = 0
            cache[pre] += 1
        return cnt