题目描述
就是给定K值,问数组中存在多少个连续子数组,子数组各元素和为K
解法
动规(其实就是把所有左边界和右边界的情况求出来,dp[i][j]表示左闭右闭)or前缀和
答案
前缀和+哈希表。Key为前缀和的值,Value为前缀和等于该值的子数组个数。例如当前位置为i,求出preSum[i],preSum[i]-K = target, 此时如果HashMap中有Key值target,那么说明该子数组[0,i]减
class Solution {
public int subarraySum(int[] nums, int k) {
int res = 0;
int len = nums.length;
Map<Integer, Integer> preSum = new HashMap<>();
int sum = 0;
preSum.put(0, 1);
for (int i = 0; i < len; i++) {
sum += nums[i];
int target = sum - k;
res += preSum.getOrDefault(target, 0);
if (preSum.containsKey(sum)) {
preSum.put(sum, preSum.get(sum) + 1);
} else {
preSum.put(sum, 1);
}
}
return res;
}
}