和为k的子数组——哈希+前缀和

76 阅读1分钟

image.png

方法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
}