题目:
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 *该数组中和为 k ***的连续子数组的个数 。
算法:
方法一:前缀和
func subarraySum(nums []int, k int) int {
sums := make([]int, len(nums))
sums[0] = nums[0]
for i := 1; i < len(nums); i ++ {
sums[i] = sums[i - 1] + nums[i]
}
count := 0
for i := range sums {
for j := i ; j < len(nums); j ++ {
// if i == j && sums[i] == k {
// count ++
// continue
// }
if sums[j] - sums[i] + nums[i] == k {
count ++
}
}
}
return count
}
方法二:前缀和+hash
sums保存j<= index <=i之间的nums数组前缀和
如果满足sums[i] - sum[j - 1] == k则count++
移项得到:如果存在一次sums[i] - k == sum[j - 1],且j<= index <=i则count++
func subarraySum(nums []int, k int) int {
sumMap := make(map[int]int)
count := 0
sum := 0
sumMap[0] = 1
for i := range nums {
sum = sum + nums[i]
if c, ok := sumMap[sum - k]; ok {
count = count + c
}
sumMap[sum] ++
}
return count
}