当前位置:实例文章 » 其他实例» [文章]【前缀和】LeetCode 560. 和为k的字数组

【前缀和】LeetCode 560. 和为k的字数组

发布人:shili8 发布时间:2025-02-26 02:52 阅读次数:0

**前缀和**
================在 LeetCode 上,第560 题是 "和为 k 的子数组"。这个问题要求我们找出给定整数数组中所有和为 k 的子数组的数量。

**问题描述**
-------------

给定一个整数数组 `nums` 和一个目标和 `k`,请返回和为 `k` 的子数组的数量。

**示例1**
--------

输入:`nums = [1,2,3], k =3`

输出:`2`

解释:和为3 的子数组是 `[1,2]` 和 `[3]`。

**示例2**
--------

输入:`nums = [1,2,3,4], k =5`

输出:`2`

解释:和为5 的子数组是 `[1,4]` 和 `[2,3]`。

**解决方案**
------------我们可以使用前缀和来解决这个问题。前缀和是一个数组,其中每个元素是原始数组中所有小于或等于该元素的元素之和。

class Solution:
 def subarraySum(self, nums: List[int], k: int) -> int:
 # 初始化前缀和数组 prefix_sum = [0] * (len(nums) +1)
 # 计算前缀和 for i in range(len(nums)):
 prefix_sum[i +1] = prefix_sum[i] + nums[i]
 # 使用哈希表存储前缀和与目标和的差值 count = {0:1}
 res =0 # 遍历前缀和数组 for i in range(len(prefix_sum)):
 # 计算当前元素与目标和的差值 diff = prefix_sum[i] - k # 如果差值存在于哈希表中,则增加结果计数 if diff in count:
 res += count[diff]
 # 更新哈希表中的值 count[prefix_sum[i]] = count.get(prefix_sum[i],0) +1 return res


**注释**
--------

* 我们首先初始化一个前缀和数组 `prefix_sum`,其中每个元素是原始数组中所有小于或等于该元素的元素之和。
* 然后,我们计算前缀和数组中的值。我们使用一个循环来遍历原始数组,并将每个元素与前一个元素的和相加,以得到当前元素的前缀和。
* 接下来,我们使用哈希表 `count` 来存储前缀和与目标和的差值。我们初始化哈希表中的值为0,表示没有任何前缀和与目标和的差值。
* 然后,我们遍历前缀和数组,并计算当前元素与目标和的差值 `diff`。如果 `diff` 存在于哈希表中,则增加结果计数 `res`。我们使用 `get()` 方法来获取哈希表中的值,如果不存在则返回0。
* 最后,我们更新哈希表中的值,表示当前元素与目标和的差值。

**时间复杂度**
--------------

时间复杂度为 O(n),其中 n 是原始数组的长度。我们使用一个循环来遍历原始数组,并计算前缀和数组中的值。

**空间复杂度**
------------空间复杂度为 O(n)。我们使用一个哈希表 `count` 来存储前缀和与目标和的差值,大小为 n。

其他信息

其他资源

Top