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中

  1. public int subarraySum(int[] nums, int k) {
  2. int pre = 0;
  3. int res = 0;
  4. HashMap<Integer, Integer> map = new HashMap<>();
  5. map.put(0, 1);
  6. for (int num : nums) {
  7. pre += num;
  8. if (map.containsKey(pre - k)) {
  9. res += map.get(pre - k);
  10. }
  11. map.put(pre, map.getOrDefault(pre, 0) + 1);
  12. }
  13. return res;
  14. }