问题
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数
例子
思路
- 方法1
暴力法 - 方法2
sum(i->j)=sum( 0->j )-sum( 0->(i-1) )
O(1)获取sum(0->i) map.put( sum(0->i), 和为sum个数 )
为了让sum(0->i)==k map.put(0,1) 有一个和为0的
代码
//暴力
class Solution {
public int subarraySum(int[] nums, int k) {
int n=0;
for(int i=0; i<nums.length; i++) {
int res = 0;
for (int j=i; j<nums.length; j++) {
res+=nums[j];
if (res==k) n++;
}
}
return n;
}
}
//preSum + map
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
int res = 0, sum_=0;
map.put(0,1);//防止漏掉前缀和sum_=k的情况,
//连续序列以i为结尾
for(int i=0; i<nums.length; i++) {
sum_+=nums[i];
if (map.containsKey(sum_-k)) {
res += map.get(sum_-k);
}
map.put(sum_,map.getOrDefault(sum_,0)+1);
}
return res;
}
}