LeetCode 560. 和为K的子数组|刷题打卡

254 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

题目链接: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

四、总结

如果需要频繁计算一个数组中的若干子数组之和,可以用前缀和来做。

如果你觉的还不错的话,给我点个赞吧💐