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

以下是使用前缀和与哈希表来解决该问题的 Python 代码,时间复杂度为 O(n),空间复杂度为 O(n):

class Solution:
    def subarraySum(self, nums, k):
        # 初始化前缀和为 0,出现次数为 1
        pre_sum = {0: 1}
        count = 0
        sum_ = 0

        for num in nums:
            # 计算当前前缀和
            sum_ += num
            # 如果前缀和-k 在哈希表中,说明存在和为 k 的子数组,计数增加
            if sum_ - k in pre_sum:
                count += pre_sum[sum_ - k]
            # 将当前前缀和的出现次数加 1 放入哈希表
            if sum_ in pre_sum:
                pre_sum[sum_] += 1
            else:
                pre_sum[sum_] = 1

        return count

整体思路如下:

我们使用前缀和的方法来解决这个问题。

首先,定义一个哈希表 pre_sum 来存储前缀和以及其出现的次数,初始时前缀和为 0 的出现次数为 1。然后遍历数组中的每个元素。

对于当前元素,计算前缀和 sum_ ,接着判断 sum_ - k 是否在哈希表中,如果在,就说明存在一个子数组的和为 k ,那么将对应的出现次数累加到结果计数 count 中。

同时,将当前前缀和在哈希表中的出现次数加 1(如果已经存在就更新次数,否则添加新的项)。

这样,通过一次遍历数组,利用哈希表快速查找和统计,就能高效地得到和为 k 的子数组的个数。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值