一、题目描述
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
注意:nums中的元素可为负数
输入:nums = [1,1,1], k = 2
输出:2输入:nums = [1,2,3], k = 3
输出:2
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
二、题目解答
class Solution {
public:int subarraySum(vector<int>& nums, int k) {//假设数组的前缀和为presum[i],那么对于任意两个下标i,j//如果presum[j]-presum[i] = k//那么从i+1到j的连续子数组合为 k//在遍历过程中,用哈希表存储前缀和出现的次数//如果存在哈希表中,那么就count+出现次数 int sum = 0;int count = 0;map <int, int> map_tmp;map_tmp [0] = 1;for (int i = 0; i < nums.size(); i++){sum = sum + nums[i];//有当前前缀和-k的前缀和if (map_tmp.find(sum - k) != map_tmp.end())count += map_tmp[sum - k];//判断完毕后再加入mapmap_tmp[sum]++;}return count;}
}