560.和为k的子数组
枚举
思路
- 依次遍历以i为起点的所有子数组,判断各数组是否满足题设
代码
/**
* 375ms
* 暴力题解
*/
public int subarraySum(int[] nums, int k) {
int len=nums.length;
int ans=0;
for(int i=0;i<len;i++){
int sum=nums[i];
if(sum==k){
ans++;
}
for(int j=i+1;j<len;j++){
sum+=nums[j];
if(sum==k){
ans++;
}
}
}
return ans;
}
- 时间复杂度 O(n^2) 空间复杂度O(1)
前缀和 + 哈希表优化
代码
/**
* 22ms
* 前缀和 哈希表优化
*/
public int subarraySum2(int[] nums,int k){
int count=0,pre=0;
Map<Integer,Integer> map=new HashMap<>();
map.put(0, 1); //<k,v> == <preSum(包含当前点),出现的次数>
for(int i=0;i<nums.length;i++){
pre+=nums[i];
if(map.containsKey(pre-k)){
count+=map.get(pre-k);
}
map.put(pre, map.getOrDefault(pre, 0)+1);
}
return count;
}