1. 和为K的子数组
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 *该数组中和为 k
***的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 <= nums.length <= 2 * 104
1000 <= nums[i] <= 1000
107 <= k <= 107
题解
可以用前缀和来求区间[j, i]是否和为K:
pre[i] - pre[j - 1] = K
所以有:
pre[i] - K = pre[j - 1]
即,要求以i结尾的区间和为K的子串的个数,我们可以转化为求前缀和为pre[i] - K的个数
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> map;
map[0] = 1;
int ans = 0, pre = 0;
for(int num : nums) {
pre += num;
if(map.find(pre - k) != map.end()) {
ans += map[pre - k];
}
map[pre] ++;
}
return ans;
}
};