和为 K 的子数组
题目链接:和为 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
方法一:前缀和+暴力
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
vector<int> nu(nums.size()+1);
nu[0] = 0;
int ans = 0;
for (int i = 1;i <= nums.size();i++) {
nu[i] = nums[i-1] + nu[i-1];
}
for (int i = 1;i <= nums.size();i++) {
for (int j = 0;j < i;j++) {
if (nu[i] - nu[j] == k) {
ans++;
}
}
}
return ans;
}
};方法二:前缀和+哈希表
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// key: 前缀和 value: 这个前缀和出现的次数
unordered_map<long long, int> cnt;
cnt[0] = 1; // 前缀和为 0 的情况(什么都没取),出现 1 次
long long sum = 0; // 当前前缀和,用 long long 更安全
int ans = 0;
for (int x : nums) {
sum += x; // 更新前缀和
long long need = sum - k; // 需要的前缀和
// 如果之前有前缀和等于 sum - k,说明存在若干子数组和为 k
if (cnt.count(need)) {
ans += cnt[need];
}
// 把当前前缀和加入哈希表
cnt[sum]++;
}
return ans;
}
};