29 lines
1.1 KiB
Markdown
29 lines
1.1 KiB
Markdown
|
### 思路讲解
|
|||
|
|
|||
|
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)。
|