leetcode原题链接:和为K的子数组
下一篇:HOT11-滑动窗口最大值
题目描述
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
解题方法:前缀和 + hash表。hash表用于保存<sum, count>,即前缀和为sum的子数组的个数(子数组的头元素都是nums[0]),连续子数组和为k,假设[i, j]连续子数组的和为k,则k= sum[j]-sum[i-1],再采用类似于《两数之和》的方法计算出结果即可。
C++代码
#include <vector>
#include <map>
class Solution {
public:
int subarraySum(vector<int>& nums, int target) {
int n = nums.size();
std::map<int, int> mp; //记录<sum, count>,记录nums数组中前缀和为sum的个数
mp[0] = 1; //考虑到如果数组中存在数值为target元素,如[3], target=3,当遍历到3时sum[0]=3, sum[0]-target=3-3=0, 此时mp[0]=1才满足要求
int count = 0;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += nums[i]; //计算当前元素对应的前缀和
if (mp.count(sum - target)) {
count += mp[sum - target];
}
mp[sum]++;
}
return count;
}
};