560.M 和为 K 的子数组
Problem: 560. 和为 K 的子数组
思路
思路1:前缀和。通过数组sums
存储前缀和,sum[i]
表示从0
到i
的和,然后有[i..j]
序列的和为sum[j] - sum[i-1]
。通过两层遍历,可以枚举出所有子序列的和。这种方式的时间复杂度为O($N^2$)
思路2:前缀和+哈希表。在思路1的基础上,把前缀和及其对应的个数存到map。然后遍历每个元素nums[i]
在哈希表中寻找sum[i]-k
的个数,能找到几个,则说明有几个以i
为结尾元素的子序列有几个。
Code
代码1:
func subarraySumV1(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]
}
ans := 0
for i := 0; i < len(nums); i++ {
for j := i; j < len(nums); j++ {
if i == 0 && sums[j] == k {
ans++
}
if i > 0 && sums[j]-sums[i-1] == k {
ans++
}
}
}
return ans
}
代码2:
func subarraySum(nums []int, k int) int {
m := make(map[int]int)
pre := 0
ans := 0
m[0] = 1
for _, num := range nums {
pre += num
ans += m[pre-k]
m[pre] += 1
}
return ans
}
Last updated
Was this helpful?