题目描述:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。
方法1:前缀和+哈希表,i次循环处理每一个数,用一个数记录第i个数的前缀和,用一个哈希表存储第i个数之前所有数的不同前缀和以及其出现的次数,只要(第i个数的前缀和-k)在哈希表中找到,就证明这几段子数组的和为k,记得map[0] = 1
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int count = 0;//和为k的子数组个数
int pre_sum = 0;//循环记录到当前数的前缀和
unordered_map<int,int>map;//记录到当前数之前所有前缀和以及其出现的次数
map[0] = 1;
for(int i=0;i<nums.size();i++){
pre_sum += nums[i];
if(map.find(pre_sum-k) != map.end()) count += map[pre_sum-k];
map[pre_sum]++;
}
return count;
}
};