和为 K 的子数组
问题描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
样例输入
cpp
nums = [1,1,1], k = 2
nums = [1,2,3], k = 3
样例输出
cpp
2
2
评测用例规模与约定
1 <= nums.length <= 2 * 10^4
-1000 <= nums[i] <= 1000
-10^7 <= k <= 10^7
解析
找到一个数组的所有子数组的和为k的数量,暴力肯定可以做到,如何优化,我们想到子数组的和可以用前缀和来表示,然后用哈希表存储和为n的子数组的数量,计算当前的前缀和 pre,检查 pre - k 是否存在于哈希表中。如果存在,说明存在若干子数组的和为 k,累加这些子数组的个数到 count,将当前前缀和 pre 存入哈希表,并增加其出现次数。最终 count 即为所有满足条件的子数组的个数。
参考程序
cpp
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;
}
};
难度等级
⭐️(1~10星)
⭐️⭐️⭐️
以个人刷题整理为目的,如若侵权,请联系删除~