LeetCode 热题560.和为k的子数组 (前缀和)
题目
思路:
某段数组的和,很容易想到用前缀和求解,i 到 j的子数组的和为 k 我们可以转化成 s[j] - s[i - 1] == k,所以 s[i - 1] =s[j] - k。
所以要求以 j 结尾的和为 k 的子数组的个数 相当于求 有多少个前缀和为 s[j] - k的前缀和 s[i] 就行。
这里我们用哈希表来存前缀和出现的次数
int len = nums.size();int ans = 0;unordered_map <int, int> m; // 统计前缀和出现的次数m[0] = 1; // 前缀和为0的先计算一次,空数组int sum = 0; // 当前的前缀和也就是 s[j]for (auto x : nums){sum += x; // 更新前缀和ans += m[sum - k]; // 加上 前缀和是 s[j] - k 的个数m[sum] ++; // 记录当前的前缀和 以便后面查询}return ans;