560.和为 K 的子数组

109 阅读1分钟

题目:
给你一个整数数组 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
}