力扣热门100题之和为k的子数组【中等】
发布人:shili8
发布时间:2025-02-22 12:48
阅读次数:0
**力扣热门100题之和为k的子数组**
**难度:** 中等**描述:**
给定一个整数数组 `nums` 和一个目标值 `k`,找出所有和为 `k` 的子数组。返回这些子数组的起始索引。
**示例1:**
输入:`nums = [1,2,3], k =3`
输出:`[[0,1,2]]`
**示例2:**
输入:`nums = [1,2,-2,4], k =4`
输出:`[[1,2,-2],[3]]`
**示例3:**
输入:`nums = [-1, -2,1,2,3], k =3`
输出:`[[3]]`
**思路:**
本题要求找出所有和为 `k` 的子数组。我们可以使用前缀和的概念来解决这个问题。
首先,我们计算出数组中每个元素的前缀和。然后,我们遍历数组,检查是否存在一个前缀和等于 `k - nums[i]` 的前缀和。如果存在,则说明有一个子数组的和为 `k`。
**代码:**
class Solution: def subarraySum(self, nums: List[int], k: int) -> List[List[int]]: # 计算前缀和 prefix_sum = {0: -1} current_sum =0 result = [] for i in range(len(nums)): current_sum += nums[i] # 检查是否存在一个前缀和等于 k - current_sum 的前缀和 if current_sum - k in prefix_sum: result.append([prefix_sum[current_sum - k] +1, i]) # 更新前缀和表 if current_sum not in prefix_sum: prefix_sum[current_sum] = i return result
**注释:**
* `prefix_sum` 是一个字典,用于存储每个元素的前缀和及其对应的索引。
* `current_sum` 表示当前元素的前缀和。
* `result` 是一个列表,用于存储所有和为 `k` 的子数组的起始索引。
**时间复杂度:**
本题的时间复杂度为 O(n),其中 n 是数组的长度。我们只需要遍历数组一次即可找到所有和为 `k` 的子数组。
**空间复杂度:**
本题的空间复杂度为 O(n)。我们需要存储每个元素的前缀和及其对应的索引,因此空间复杂度为 O(n)。
以上就是力扣热门100题之和为k的子数组的解决方案。