方法1:前缀和+哈希表
pre[j - 1] = pre[i] - k
如若目标子数组的下标为(j ~ i),则前i项和与K的差必然为前(j-1)项和,因此用前n项和为key,前n项和出现的次数为value,运用Hash算法,快速得出答案。
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(n)
代码:
public int subarraySum(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
int pre = 0;
int count = 0;
map.put(0,1);
for(int i = 0; i<nums.length ; i++)
{
pre += nums[i];
if(map.containsKey(pre - k))
count += map.get(pre-k);
if(map.containsKey(pre))
map.put(pre, map.get(pre) + 1);
else
map.put(pre,1);
}
return count;
}
方法2:暴力方法
每一轮循环:i依次前进一位,j以i为开始,递增求和比较
复杂度分析:
时间复杂度:O(n^2)
空间复杂度:O(1)
代码:
int subarraySum(int* nums, int numsSize, int k){
int count = 0;
for(int i = 0; i < numsSize; i++){
int tmp = 0;
for(int j = i; j < numsSize; j++){
tmp += nums[j];
if(tmp == k)
count += 1;
}
}
return count;
}