Description
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].
Solution
This question can be solved by using range sum approach. Basically, a sum of a range in a array can be calculated as below:
So, for this question, we can keep records of sum along with the array iteration, then check if there is an element in the past that helps build a range sum equals to target K.
Code
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int sum = 0, res = 0;
unordered_map<int, int> preSumCount;
preSumCount[0] = 1; /*❶*/
for(int i = 0; i < nums.size(); ++i) {
sum += nums[i];
if(preSumCount.count(sum - k)){ /*❷*/
res += preSumCount[sum - k];
}
preSumCount[sum]++; /*❸*/
}
return res;
}
};
❶ key is the sum value at current index, value is the number of current sum value.
❷ check if we have a right value, conforms sum(current) - sum(aValue) = K.
❸ update the map states.