前缀和是处理数组区间查询的高效手段,配合哈希表能显著降低时间复杂度。下面通过两道经典题目,深入剖析其核心逻辑与实现细节。
和为 K 的子数组
题目链接:
题目描述:

解题思路:
设 i 为当前遍历到的位置,sum[i] 表示从索引 0 到 i 的前缀和。若存在某个起始位置 x,使得子数组 [x, i] 的和等于 k,则必然满足:
sum[i] - sum[x-1] = k
=> sum[x-1] = sum[i] - k
这意味着,我们只需要统计在当前位置之前,有多少个前缀和等于 sum[i] - k。无需维护完整的前缀和数组,只需一个哈希表记录每个前缀和出现的次数即可。
C++ 实现:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> hash;
hash[0] = 1; // 初始化,处理从索引 0 开始的子数组
int sum = 0, ret = 0;
for ( x : nums) {
sum += x;
(hash.(sum - k)) {
ret += hash[sum - k];
}
hash[sum]++;
}
ret;
}
};



