子串
560. 和为 K 的子数组
直接解很简单,双重循环遍历求和。
优化解很容易想到是存储部分子串计算结果避免重复计算,但是官方题解的解题思路更加巧妙,利用两个前缀作差获取连续子串。
我们只遍历一次数组,每次循环中记录从0开始到当前位置的前缀子串求和值 pre,并在此轮循环中查找有多少个求和=pre-目标值 k 的前缀子串。因为用两个前缀子串作差的结果一定是一个连续子串。
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int pre = 0;
for (int i = 0; i < nums.length; i++) {
pre += nums[i];
if (map.containsKey(pre - k))
count += map.get(pre - k);
map.put(pre, map.getOrDefault(pre, 0) + 1);
}
return count;
}
}