/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
//iterative O(n^2) time complexity
var subarraySum = function (nums, k) {
const len = nums.length
let count = 0
for (let i = 0; i < len; i++) {
let sum = nums[i]
if (sum === k) {
count++
}
for (let j = i + 1; j < len; j++) {
sum += nums[j]
if (sum === k) {
count++
}
}
}
return count
}
//accumulative sum, hash (from Henry's explanation)
//Time complexity - O(n)
//Space complexity -O(n) (for the hash map)
var subarraySum = function (nums, k) {
const len = nums.length,
cumSumHash = { 0: 1 }
let cumSum = 0,
count = 0
for (let i = 0; i < len; i++) {
cumSum += nums[i]
if (cumSumHash[cumSum - k]) {
count += cumSumHash[cumSum - k]
}
cumSumHash[cumSum] = cumSumHash[cumSum] ? cumSumHash[cumSum] + 1 : 1
}
return count
}
//Test cases
console.log(subarraySum([-1, -1, 1], 0) === 1)
console.log(subarraySum([1], 0) === 0)
console.log(subarraySum([1, 1, 1], 2) === 2)
console.log(subarraySum([2, -1, 2, -2, 3], 3) === 3)