描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
分析
暴力方法求每个子数组的和经过优化时间复杂度是O(n^2)会超时。
哈希+前缀和
前缀和:由第一个元素到当前元素的和。每个元素都这样求。
用前缀和做差可以得到任何一个子数组的和。
利用两个前缀和的差等于K来得出有子数组的和等于K。
哈希的作用是统计每种前缀和的个数。
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int preSum = 0, ans = 0;
for (int num : nums) {
preSum += num;
if (map.containsKey(preSum-k)) {
ans += map.get(preSum-k);
}
map.put(preSum,map.getOrDefault(preSum,0)+1);
}
return ans;
}
}