1. 题目
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
2. 题解
- 暴力解法(不推荐,这就没啥意思了)
func subarraySum(_ nums: [Int], _ k: Int) -> Int {
var count = 0
for start in 0..<nums.count {
var sum = 0
for end in start..<nums.count {
sum += nums[end]
if sum == k {
count += 1
}
}
}
return count
}
- 标准思路: 前缀和 + 哈希表
func subarraySum(_ nums: [Int], _ k: Int) -> Int {
// [1,2,2,1,3,4,5] k = 4
/**
和为4,也可以是前5个数组元素减去前3个数组元素
1,2,2,1,3
- 1,2,2
------------
4
(1) var dict: [Int: Int] = [0: 1] 代表的意思:
数组和为0的,存在1个,就是下标为0的前面,也就是没有元素的情况
(2) count += dict[sum - k]! 代表的意思:
总数量是 : 字典中符合情况的value的和
*/
var count = 0
var dict: [Int: Int] = [0: 1]
var sum = 0
for i in 0..<nums.count {
sum += nums[i]
if dict.keys.contains(sum - k) {
count += dict[sum - k]!
}
if let value = dict[sum] {
dict[sum] = value + 1
} else {
dict[sum] = 1
}
}
return count
}