由于题目要求子数组必须连续,也就是需要一个和为K的区间,可以利用前缀和预处理后,枚举找到这些区间段[l,r]
,使之满足s[r] - s[l] = k
。
不理解前缀和的可以先看这里。
class Solution {
public:int subarraySum(vector<int>& nums, int k) {int s[nums.size() + 1];memset(s, 0, sizeof s);// 存储前缀和,定义从1开始for(int i = 1;i <= nums.size();i ++) s[i] = nums[i - 1] + s[i - 1];unordered_map<int, int> mp; // 哈希表存下已经出现过的前缀和int cnt = 0;// 确保s[i] = k时,能统计这单个s[i]为1个子数组(s[i] - k = 0)mp[0] = 1;for(int i = 1;i <= nums.size();i ++){//前面已经出现过的s[i] - k的个数,正是和为 k 的子数组的个数//因为s[i](后) - (s[i] - k)(前) = kcnt += mp[s[i] - k];mp[s[i]] ++;}return cnt;}
};