1、基于前缀和的求解
前缀和是一种常见的算法,用于高效计算数组中某个区间内元素的和。 它的基本思想是预处理出数组的前缀和数组,然后利用前缀和数组快速计算任意区间的和,而不需要每次都重新遍历整个区间。 具体来说,前缀和数组 $sum$ 的第 $i$ 个元素表示原数组中前 $i$ 个元素的和 即 $sum[i]=a[0]+a[1]+····+a[i-1]$。然后,计算区间 [l,r] 的和时,只需要用 sum[r+1]-sum[l] 即可。
和为 K 的子数组
利用map存储前缀和与其前缀子数组出现的次数,在循环中,如果map中包含 pre-k 结果加一,为了方便计算,可以在map存入(0,1),最后将当前的数组遍历存入到map中
public int subarraySum(int[] nums, int k) {
int pre = 0;
int res = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
for (int num : nums) {
pre += num;
if (map.containsKey(pre - k)) {
res += map.get(pre - k);
}
map.put(pre, map.getOrDefault(pre, 0) + 1);
}
return res;
}