560. 和为 K 的子数组

type
status
date
slug
summary
tags
category
difficulty
icon
password

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 
子数组是数组中元素的连续非空序列。
示例 1:
示例 2:
提示:
  • 1 <= nums.length <= 2 * 104
  • 1000 <= nums[i] <= 1000
  • 107 <= k <= 107
解题思路:
这道题目要求统计和为k的子数组个数,我们可以使用前缀和 + 哈希表的方法来解决。以下是具体思路:

1. 前缀和数组

首先构建前缀和数组 s,其中 s[i] 表示 nums[0] 到 nums[i-1] 的元素和。这样,任意区间 [i,j] 的和就可以通过 s[j+1] - s[i] 得到。

2. 哈希表的应用

使用哈希表 map 记录每个前缀和出现的次数。对于当前遍历到的前缀和 s[i],如果存在一个前缀和等于 s[i] - k,那么说明存在一个子数组的和为 k。

3. 具体实现步骤

  • 初始化哈希表,空数组的和为0出现1次,即 map[0] = 1
  • 遍历前缀和数组,对于每个位置 i:
  • 查找是否存在前缀和为 s[i] - k 的位置,如果存在,将其出现次数累加到结果中
  • 更新当前前缀和 s[i] 在哈希表中出现的次数

4. 时间复杂度分析

  • 时间复杂度:O(n),其中 n 是数组长度。我们只需要遍历一次数组。
  • 空间复杂度:O(n),需要哈希表来存储前缀和。

5. 举例说明

以示例 nums = [1,1,1], k = 2 为例:
  1. 构建前缀和数组 s = [0,1,2,3]
  1. 遍历过程中的哈希表变化:
  • i=1时:查找s[1]-k=1-2=-1的个数,map={0:1,1:1}
  • i=2时:查找s[2]-k=2-2=0的个数,找到1个,map={0:1,1:1,2:1}
  • i=3时:查找s[3]-k=3-2=1的个数,找到1个,map={0:1,1:1,2:1,3:1}
最终返回找到的2个子数组:[1,1] 和 [1]。
上一篇
239. 滑动窗口最大值
下一篇
3. 无重复字符的最长子串

评论
Loading...