给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

 

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

 

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107
Related Topics
  • 数组
  • 哈希表
  • 前缀和

  • 👍 1552
  • 👎 0
  • 连续区间和,必然会想到的内容前缀和数组

    所以在这题目中,我们的思路是这样的

    1. 要求区间和为K的子数组的话,那么就需要判断 在当前位置前面,是否存在前缀和为当前区间和减去K的情况存在
    2. 可以在前缀和数组上遍历,当然我们有更好的选择,哈希表
    3. 在求前缀和数组的过程中,用哈希表统计各个值的前缀和出现次数
    4. 那么当前位置的前缀和 与这个位置之前的 前缀和能组成多少个符合 区间和为K的区间就可以等价🐟, 当前位置之前有多少个 当前位置区间和 减去 K的值的区间和的数量
    5. 边界考虑:当什么都没有的时候有一个区间和为0的情况

    代码

    class Solution {
        public int subarraySum(int[] nums, int k) {
            int[] preSum = new int[nums.length];
            HashMap<Integer,Integer> hashMap = new HashMap<>();
            hashMap.put(0,1);
            int idx = -1;
            int count = 0;
    
            while (++idx < nums.length){
                preSum[idx] = nums[idx] + (idx>0?preSum[idx-1]:0);
                count += hashMap.getOrDefault(preSum[idx] - k,0);
                hashMap.put(preSum[idx], hashMap.getOrDefault(preSum[idx],0)+1);
            }
            return count;
        }
    }