560 和为k的子数组-中等
题目:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
解题思路
子数组是指连续的非空序列。
暴力求解,详见解法1。既然是连续的子数组,那么就可以两层遍历,第一层遍历每个元素,第二层从该元素开始往前遍历求和,只要等于目标指,结果加一。目标值可能为零,元素也可能为零,所以第二层遍历不能够匹配到目标值后就跳出,所以遍历所有情况。
前缀和,详见解法2。子序和为k,也可以看成是前缀和之间的差为 k,所以我们可以这样做:声明变量 preSum,然后从前往后遍历,计算前缀和,并保存在 map 中,从 map 中查找 pre-k的个数。
// date 2024/01/16
// 解法1
// 暴力求解
func subarraySum(nums []int, k int) int {
n := len(nums)
ans := 0
for i := 0; i < n; i++{
sum := 0
for j := i; j >= 0; j-- {
sum += nums[j]
if sum == k {
ans++
}
}
}
return ans
}
// 解法2
// 前缀和 + 哈希查找
func subarraySum(nums []int, k int) int {
n := len(nums)
ans := 0
preSum := 0
m := make(map[int]int)
m[0] = 1
for i := 0; i < n; i++{
preSum += nums[i]
if ct, ok := m[preSum-k]; ok {
ans += ct
}
m[preSum]++
}
return ans
}
最后更新于