Here's the solution:
function subarraySum(nums, k)
prefixSum := 0
count := 0
freq := {0: 1} // hash map with initial entry
for each num in nums
prefixSum := prefixSum + num
// Count subarrays ending here with sum k
target := prefixSum - k
if target in freq
count := count + freq[target]
// Update frequency map
if prefixSum in freq
freq[prefixSum] := freq[prefixSum] + 1
else
freq[prefixSum] := 1
return count
Time: . Space: .