本题难度并不高,但是有点难想到,理解之后就非常简单了。
核心算法:
- 构建一个
HashMap<Integer, Integer>
,key
是和,value
是出现的次数。 - 这个想法的最大阻碍是以为要算所有的subarray,这样复杂度就变成了,其实不用!!只需要计算从
0
开始的即可,找到sum
,和sum-k
即可.class Solution {
public int subarraySum(int[] nums, int k) {
if (nums == null || nums.length == 0) {
throw new IllegalArgumentException("Invalid Input");
}
int sum = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int count = 0;
for (int i = 0; i < nums.length; ++i) {
sum += nums[i];
if (map.containsKey(sum - k)) {
count += map.get(sum - k);
}
if (map.containsKey(sum)) {
map.put(sum, map.get(sum) + 1);
}
else {
map.put(sum, 1);
}
}
return count;
}
}