class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1;
int count = 0, pre = 0;
for (auto& x : nums)
{
pre += x;
if (mp.find(pre - k) != mp.end())
{
count += mp[pre - k];
}
mp[pre] ++;
}
return count;
}
};
这段代码是一个解决特定问题的算法实现,即寻找和为特定值
k
的连续子数组的数量。下面是具体的步骤讲解:
unordered_map<int, int> mp;
创建一个哈希表,用于存储前缀和及其出现的次数。
mp[0] = 1;
初始化哈希表,将前缀和为 0 的计数设置为 1,这是为了处理当子数组的起始点在数组的第一个元素之前的情况。
int count = 0, pre = 0;
初始化计数器count
,用于记录和为k
的子数组的数量,以及前缀和pre
。
for (auto& x : nums)
遍历输入数组nums
中的每个元素。
pre += x;
更新当前的前缀和,将当前元素x
的值加到pre
上。
if (mp.find(pre - k) != mp.end())
检查是否存在一个前缀和,使得pre - (pre - k) = k
,即从某个点到当前元素的和为k
。
count += mp[pre - k];
如果存在这样的前缀和,说明找到了一个和为k
的子数组,将这个前缀和对应的次数加到count
上。
mp[pre] ++;
更新哈希表,将当前的前缀和pre
的计数增加 1。
return count;
遍历完成后,返回计数器count
的值,即和为k
的子数组的数量。这个算法的时间复杂度是 O(n),其中 n 是数组
nums
的长度,因为算法只需要遍历数组一次。空间复杂度是 O(n),因为需要存储前缀和的哈希表,最坏情况下前缀和的数量与数组的长度相同。