题目:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回该数组中和为 k
的连续子数组的个数。
示例:
输入:nums = [1,1,1], k = 2 输出:2
思路:
刚想到就是滑动数组,这题跟之前有一题滑动数组的挺像的
主要是有连续子数组这个条件
因为nums[i]
可以小于0,也就是说右指针i
向后移1位不能保证区间会增大,左指针j
向后移1位也不能保证区间和会减小。给定j
,i
的位置没有二段性,处理不了负值
使用前缀和是正解
复杂度:
时间复杂度:遍历O(n)
空间复杂度:hashmapO(n)
代码:
public int subarraySum(int[] nums, int k) {
//map存放前缀和,key是前缀和,value是和出现的次数
Map<Integer,Integer> map = new HashMap<>();
//放进去0位置的元素,前面没有数,因此前缀和是0,出现一次
map.put(0,1);
int res =0,sum=0;
//遍历
for(int num:nums){
//累加前缀和
sum+=num;
//有就加。一定是先查再放
if(map.containsKey(sum-k)){
res+=map.get(sum-k);
}
//放进去
map.put(sum,map.getOrDefault(sum,0)+1);
}
return res;
}