给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
解答:
public int subarraySum(int[] nums, int k) { int ret = 0; int sum = 0; Map<Integer, Integer> map = new HashMap<Integer, Integer>(); // key:前缀和[0,i]; value:个数 map.put(0, 1); // 初始,前缀和为0的个数是1,即一个都不选的时候(左边界) for (int i = 0; i < nums.length; ++i) { sum += nums[i]; if (map.containsKey(sum - k)) { ret += map.get(sum - k); } map.put(sum, map.getOrDefault(sum, 0) + 1); } return ret; }
用例:
3 4 7 2 -3 1 4 2 ,k = 7
初始:map---[(0,1)],结果ret = 0,前缀和sum=0
sum | sum-k | (sum-k)是否在map中存在 | ret | 更新map | |
初始 | 0 | [(0,1)] | |||
3 | 3 | -4 | 否 | 0 | [(0,1),(3,1)] |
4 | 7 | 0 | 是 | 1 | [(0,1),(3,1),(7,1)] |
7 | 14 | 7 | 是 | 2 | [(0,1),(3,1),(7,1),(14,1)] |
2 | 16 | 9 | 否 | 2 | [(0,1),(3,1),(7,1),(14,1),(16,1)] |
-3 | 13 | 6 | 否 | 2 | [(0,1),(3,1),(7,1),(14,1),(16,1),(13,1)] |
1 | 14 | 7 | 是 | 3 | [(0,1),(3,1),(7,1),(14,2),(16,1),(13,1)] |
4 | 18 | 11 | 否 | 3 | [(0,1),(3,1),(7,1),(14,2),(16,1),(13,1),(18,1)] |
2 | 20 | 13 | 是 | 4 | [(0,1),(3,1),(7,1),(14,2),(16,1),(13,1),(18,1),(20,1)] |
因此最后结果为4