eg.力扣典型例题
974. 和可被 K 整除的子数组 - 力扣(LeetCode)
前缀和 + hash表的关键步骤:
1、进入循环
2、根据题意设置hash[0]
3、计算前缀和sum
4、hash表:key => sum , value => 当前前缀和的个数(下标)
5、比较当前sum和之前的sum(hash[sum])的关系
6、更新答案
7、继续循环
eg.560. 和为 K 的子数组 - 力扣(LeetCode)
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
class Solution
{
vector<int> pre_s;
public:
int subarraySum(vector<int> &nums, int k)
{
unordered_map<int, int> hash;
hash[0] = 1; // 因为前缀和为0的长度为1 所以hash[0]储存1
int ans = 0, sum = 0; // 初始化
for (int i : nums)
{ // 开始循环
sum += i; // 计算前缀和
if (hash[sum - k]) // 如果之前出现满足题意的sum
ans += hash[sum - k]; // 更新答案
hash[sum]++; // 如果之前不存在 sum 就储存 当前sum
}
return ans;
}
};
前缀和 + hash表的原理:
核心其实就是判断 当前 sum 是否在之前存在过(通过hash表来实现) 然后根据题意来判断 结果的更新方式