思路
刚开始以为是滑动窗口双指针,但是发现,有负值,那么,如果窗口内的值大于k,左指针右移不一定是使区间的值减小。就没法了
方法一
双层循环,即判断从i开始,往前计算和为k的数量,每次内层循环必须循环到0,因为可能有多个值(因为有负数)
方法二
前缀和
假设pre[i]表示 a1,a2,a3…ai的和
则pre[i] -pre[j] == k
i到j就是满足条件的子数组。
还是因为有负数,所以上面三个子串都可能满足条件
代码
public int subarraySum(int[] nums, int k) {Map<Integer, Integer> map = new HashMap<>();int pre = 0;int count = 0;map.put(0,1); //很关键for (int i = 0; i < nums.length; i++) {pre = pre + nums[i];if (map.containsKey(pre - k)){count = count + map.get(pre - k);}map.put(pre, map.getOrDefault(pre,0) + 1);}return count;}```