int[] arr = newint[nums.length]; arr[0] = nums[0]; for (int i = 1; i < arr.length; i++) { arr[i] = arr[i - 1] + nums[i]; }
1 2 3 4 5 6 7 8 9 10
int res = 0; for (int i = 0; i < nums.length; i++) { for (int j = i; j < nums.length; j++) { int s = arr[j] - arr[i] + nums[i]; if (s == k) { res += 1; } } } return res;
当然,前缀和这个用在这里优点麻烦了,可以直接用sum进行局部求和
看了题解,发现问题可以变得更简单,如图
比如[1,2,1,2,1] 和为3
我们记录数组sum[i]为0~i-1的和
sum[0] = 0
0
1
3
4
6
7
所以整个问题就转化为从sum数组中找到两个数字,满足a-b=target (a > b)
即找到一个数b = a - target
这个可以参考两数之和,变成了两数之差
1 2 3 4 5 6 7 8
Map<Integer, Integer> map = new HashMap<>(); for (int i = 1; i < sum.length; i++) { if (map.containsKey(sum[i] - k)) { // sum[i] -k = b (判断b在不在map里面) // 里面存在目标值 } // 不管包不包含,将sum[i] = a 记录到map中,如果存在就+1,不存在设置为1 map.put(sum[i], map.getOrDefault(sum[i], 0) + 1); }
classSolution{ publicintsubarraySum(int[] nums, int k){ int[] arr = newint[nums.length]; arr[0] = nums[0]; for (int i = 1; i < arr.length; i++) { arr[i] = arr[i - 1] + nums[i]; }
int res = 0; for (int i = 0; i < nums.length; i++) { for (int j = i; j < nums.length; j++) { int s = arr[j] - arr[i] + nums[i]; if (s == k) { res += 1; } } } return res; } }