LeetCode 560 Medium 和为K的子数组 Python

本文介绍了一种高效求解子数组和等于特定值K的个数的算法,通过使用哈希表记录累加和,实现时间复杂度为O(N)的解决方案。文章详细解释了算法思路,避免了暴力解法的冗余,展示了如何利用哈希表存储前缀和,快速查找满足条件的子数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def subarraySum(nums, k):
    """
    Inspired By Hint
    算法:哈希表
    思路:
        首先可以把最暴力的解法写出来,用三层for 遍历一个一个子序列,这样明显有冗余
        可以稍微改进,用两层for 来遍历,用一个sum记录前面的累加和,再记录sum += nums[i]加当前的就好了

        下面这个是ON的做法,因为sum(i,j) = sum(0:j)-sum(0:i),所以可以在一次遍历中,记录0:i的sum值
        并且用hash表存储起来,就像two sum 一样,如果当前和是3,目标是10,那么就期望后面有一刻和是13,即
        key = curr_sum+k,代表着需要这个key的值的前序有多少个子序列,所以如果某次遍历中curr_sum in hash_map
        的话,就counter += hash_map[key].
    复杂度:
        时间:ON
        空间:ON
    """
    counter = 0
    hash_map = {k: 1}
    curr_sum = 0
    for i in range(len(nums)):
        curr_sum += nums[i]
        if curr_sum in hash_map:
            counter += hash_map[curr_sum]
        hash_map.setdefault(curr_sum + k, 0)
        hash_map[curr_sum + k] += 1
    return counter

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值