### 思路讲解 1. **前缀和的定义** 定义前缀和 `preSum[i]` 为数组 `nums` 从索引 0 到 i 的元素和,即 $$ \text{preSum}[i] = \sum_{j=0}^{i} \text{nums}[j] $$ 2. **子数组和的关系** 对于任意子数组 `nums[i+1..j]`(其中 `0 ≤ i < j < n`),其和可以表示为 $$ \text{sum}(i+1,j) = \text{preSum}[j] - \text{preSum}[i] $$ 当这个子数组的和等于 k 时,有 $$ \text{preSum}[j] - \text{preSum}[i] = k $$ 即 $$ \text{preSum}[i] = \text{preSum}[j] - k $$ 3. **利用哈希表存储前缀和** 我们可以使用一个哈希表 `prefix` 来存储每个前缀和出现的次数。 - 初始时,`prefix[0] = 1`,表示前缀和为 0 出现一次(对应空前缀)。 - 遍历数组,每计算一个新的前缀和 `preSum`,就查看 `preSum - k` 是否在哈希表中。如果存在,则说明之前有一个前缀和等于 `preSum - k`,那么从该位置后一个位置到当前索引的子数组和为 k,累加其出现的次数。 4. **时间复杂度** 该方法只需要遍历数组一次,时间复杂度为 O(n)。