方法1(枚举) :
两层for循环,第一层确定初始位置,第二层确定结束位置,枚举答案
func subarraySum(nums []int, k int) int {
var ans int
for i := 0; i < len(nums); i++ {
a := 0
for j := i; j < len(nums); j++ {
a = a + nums[j]
if a == k {
ans++
}
}
}
return ans
}
方法2(哈希+前缀和):
哈希的键值对为 {sum:sum出现的次数}
一层for循环,for循环的途中记录sum,判断(sum-k)的值是否在哈希表中记录,如果记录使ans += hash(sum-k),将sum写入哈希。
初始化hash时候直接将{0:1}键值对填进去,这代表这和为0的子数组出现了一次,这是显而易见的
func subarraySum(nums []int, k int) int {
ans,sum := 0,0
hash := map[int]int{0:1}
for i := 0; i < len(nums); i++ {
sum += nums[i]
if v,ok := hash[sum - k]; ok {
ans += v
}
hash[sum]++
}
return ans
}