首先先讲一下前缀和,例如[1,1,1]的前缀和为[1,2,3]。所以在题目当中子数组是数组中元素的连续非空序列,立马联想到前缀和去解题。如力扣第560题和为K的子数组。
但是为了得到一个公式,如下(灵神思路)
所以本题目,可以把K看成所要求的子数组和,而连续子数组的元素和可以根据上述公式转化为两个前缀和之差。
class Solution: def subarraySum(self, nums: List[int], k: int) -> int: #子数组是数组中元素的连续非空序列 --> 立马可以想到前缀和 s = [0] *(len(nums) + 1) for i, n in enumerate(nums): #求前缀和 s[i+1] = s[i] + n ans = 0 cnt = defaultdict(int) for x in s: #这个x是前缀和 ans += cnt[x - k] cnt[x] += 1 #统计符合所有的 然后ans 只找x-k 这个值在不在 有的话就加上 return ans
难点1:如果使用暴力解法,复杂度会很大,导致超时。
难点2:前缀和思路