Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
Example 1:
Input:nums = [1,1,1], k = 2
Output: 2
Note:
The length of the array is in range [1, 20,000].
The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].
本来想用滑动窗口解决此问题,但是代码越写越麻烦,最后放弃此方法,改用一个巧妙的方法,如果当前的连续子数组的和为sum-k,下一段连续子数组的和为sum,则此中间段的元素和为k,可以建立一个map映射储存连续子数组的元素和和出现的次数。
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> res;
int count = 0;
int sum = 0;
res[0] = 1;
for (auto x : nums){
sum += x;
count += res[sum - k];
++res[sum];
}
return count;
}