一、力扣560.和为k的子数组
- 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
- 输入:nums = [1,1,1], k = 2
- 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
(一)暴力枚举(双重循环)
- 枚举数组中所有的子数组,统计出和为k的子数组的个数。
- 双重循环的思想比较简单,但是会超出题目限制。代码如下:
int subarrySum(vector<int>& nums, int k)
{
int sum = 0, count = 0;
for (int i = 0; i < nums.size(); i++)
{
for (int j = i; j < nums.size(); j++)
{
sum += nums[j];
if (sum == k)
{
count++;
}
}
sum = 0;
}
return count;
}

(二)前缀和思想+哈希优化
- 所谓前缀和,就是对于一个给定的数列A,它的前缀和数列S是通过递推能求出来的部分和。
- 举个例子如下:

- 假设我们要获取nums[2]到nums[4]这个区间的和,可以用下图所示方法得到:


int subarrySum(vector<int>& nums, int k)
{
unordered_map<int, int> mp;
int count = 0;
int pre = 0;
mp[0] = 1;
for (auto& x : nums)
{
pre += x;
if (mp.find(pre - k) != mp.end())
{
count += mp[pre - k];
}
mp[pre]++;
}
return count;
}
二、力扣974.和可被k整除的子数组
- 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。
- 输入:A = [4,5,0,-2,-3,1], K = 5
- 输出:7
- 解释:有 7 个子数组满足其元素之和可被 K = 5 整除:
[4, 5, 0