给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
题目信息:连续,nums[i]可以为负数
暴力解法,双层循环,复杂度 O(n2)
因为 nums[i]可能为负数,所以不能用滑动窗口调整窗口内和的大小来匹配 k
只能用前缀和与哈希来讲问题转换为求前缀和的差值为 k sum(i,j)=sum(0,j)-sum(0,i)
function subarraySum(nums: number[], k: number): number {
let res = 0
for (let i = 0; i < nums.length; i++) {
if (nums[i] === k) {
res++
}
let sum = nums[i]
for (let j = i + 1; j < nums.length; j++) {
sum += nums[j]
if (sum === k) {
res++
}
}
}
return res
}
function subarraySum(nums: number[], k: number): number {
const map: Record<number, number> = { 0: 1 }
let prefixSum = 0
let res = 0
for (let i = 0; i < nums.length; i++) {
prefixSum += nums[i]
if (map[prefixSum - k]) {
res += map[prefixSum - k]
}
map[prefixSum] = map[prefixSum] ? map[prefixSum] + 1 : 1
}
return res
}