LeetCode 560 和为 K 的子数组
问题描述
给定一个整数数组 nums
和一个整数 k
,统计并返回该数组中和为 k
的子数组的个数。
子数组是数组中元素的连续非空序列。
解决方法
我们可以使用哈希表来解决这个问题。具体步骤如下:
- 创建一个哈希表
map
,用于存储前缀和与其出现次数的映射关系。 - 初始化变量
count
用于记录符合条件的子数组个数,以及变量sum
用于记录当前子数组的和。 - 将哈希表初始化为
{0: 1}
,这里我们给定一个虚拟值,表示前缀和为0的情况出现了1次,这在后续计算中会非常有用。 - 遍历数组
nums
,计算累积和sum
。 - 在每次遍历中,我们检查
sum - k
是否在哈希表中存在,如果存在,则说明之前有某段区间的和等于sum - k
,那么从该区间到当前位置的子数组和为k
。 - 将当前前缀和
sum
加入哈希表,并更新哈希表中sum
对应的出现次数。
下面是使用 C++ 实现的代码:
class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> map;int count=0;int sum=0;map[0]=1; // 哈希表我们给个虚拟值for(auto num:nums){sum+=num;if(map.find(sum-k)!=map.end()){count+=map[sum-k];}map[sum]++;}return count;}
};
复杂度分析
-
时间复杂度:
- 遍历数组一次,对每个元素进行常数时间的操作。因此,时间复杂度为 O(N),其中 N 是数组的长度。
-
空间复杂度:
- 使用了一个哈希表来存储前缀和的出现次数,哈希表的大小最多为数组长度 N。因此,空间复杂度为 O(N)。
总结
本文介绍了使用哈希表解决数组中子数组和为特定值的问题。通过在遍历过程中记录累积和及其出现次数,我们可以在 O(n) 的时间复杂度内解决该问题,避免了暴力求解的高时间复杂度。这种方法在实际应用中具有较高的效率和可扩展性,可以解决更加复杂的子数组和问题。