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