子串

和为 K 的子数组

中等#560Java时间 O(n),平均空间 O(n)

题目要做什么

求数组中和等于 k 的非空连续子数组数量。数组可能包含负数,因此不能用普通滑动窗口。

题目示例输入nums = [1,1,1], k = 2
题目示例输出2

01 为什么这样做

前缀和 prefix 的子数组和为 k,等价于之前出现过 prefix−k。哈希表记录每个前缀和出现的次数,先查询再记录当前前缀。

始终成立的条件

处理当前元素时,freq 只包含之前的前缀和;初始前缀 0 出现一次。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int subarraySum(int[] nums, int k) {3        Map<Integer, Integer> freq = new HashMap<>();4        freq.put(0, 1);5        int prefix = 0, count = 0;6        for (int x : nums) {7            prefix += x;8            count += freq.getOrDefault(prefix - k, 0);9            freq.put(prefix, freq.getOrDefault(prefix, 0) + 1);10        }11        return count;12    }13}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索