这道题跟325非常像,具体思路基本一致,不懂的话可以去看一下325的解法,唯一不同的是这次哈希表的value存储的是“和为key的子序列出现的次数”。
这道题做的过程中遇到了一些小波折,我一开始的做法是先把哈希表建好,然后再做一个1到nums.length的循环遍历,这样做不仅速度慢而且是错误的,正确的做法是找解的同时建立哈希表,避免了i去匹配比他位置靠后的子序列的问题。
class Solution {
public int subarraySum(int[] nums, int k) {
int ret = 0;
for(int i=1;i < nums.length;i++) {
nums[i] += nums[i-1];
}
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i < nums.length;i++) {
if(nums[i] == k)
ret++;
if(map.containsKey(nums[i] - k))
ret += map.get(nums[i] - k);
if(!map.containsKey(nums[i])) {
map.put(nums[i],1);
} else {
int temp = map.get(nums[i]);
temp++;
map.put(nums[i],temp);
}
}
return ret;
}
}