前言
保持前后缀和、滑动窗口对连续子数组的敏感性。
一、案例
二、题解
数组无序,且有正有负,可以记录前缀和,然后每次查询当前前缀和 - K是否存在,若存在计数加一。
package com.xhu.offer.offerII;
import java.util.HashMap;
import java.util.Map;
//和为K的子数组
public class SubarraySum {
//总结:保持前后缀和、滑动窗口对连续子数组的敏感性。
public int subarraySum(int[] nums, int k) {
//记录前缀和多少来看有多少连续子数组。
int count = 0, sum = 0, len = nums.length;
Map<Integer, Integer> prefix = new HashMap<>();
prefix.put(0, 1);
for (int i = 0; i < len; i++) {
sum += nums[i];
int gap = sum - k;
count += prefix.getOrDefault(gap,0);
prefix.put(sum, prefix.getOrDefault(sum, 0) + 1);
}
return count;
}
}
总结
1)保持前后缀和、滑动窗口对连续子数组的敏感性。
参考文献
[1] LeetCode 原题