题目
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数
- 输入与输出
输入:
nums = [1,1,1], k = 2
输出: 2
解释: 此题[1,1]
与[1,1]
为两种不同的情况
思路
- 暴力搜索
- 前缀和 + 哈希表优化( 这个方法也是看了 官方题解视频 才搞懂的,讲得也比较清晰。)
具体思路看代码详解!
代码
- 暴力搜索
class Solution {
public int subarraySum(int[] nums, int k) {
int res = 0;
for (int i = 0; i < nums.length; i++) {
int sum = nums[i];
if (sum == k) {
res++;
}
for (int j = i+1; j < nums.length; j++) {
sum += nums[j];
if (sum == k) {
res++;
}
}
}
return res;
}
}
- 前缀和 + 哈希表优化
class Solution {
public int subarraySum(int[] nums, int k) {
int res = 0;
int sum = 0;
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
// 如果 map 中存在某个 key == k,那么就存在这样一个子数组
// nums = {1,2,3,3,5}
// k = 6
// map.put(0,1)
// map.put(1,1)
// map.put(3,1)
// sum = 3 + 3 = 6
// 进入条件分支 res++
// map.put(6,1)
//....
if (map.containsKey(sum-k)) {
res += map.get(sum-k);
}
// 放在 if 条件分支后,防止结果重复
map.put(sum,map.getOrDefault(sum,0)+1);
}
return res;
}
}