给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。
子数组是数组中元素的连续非空序列。
//滑动窗口需要满足单调性,当右端点元素进入窗口时,窗口元素和是不能减少的。 /* s[i]为前缀和 s[i+1]=s[i]+nums[i]; 我们要求s[j]-s[i]=k --> s[j]-k=s[i] 所以对每个s[j]进行遍历,i<j,存在cnt[j]即++ 主要讲双重遍历中内遍历变成了哈希优化,contains() mp对应sj-k:个数 */ class Solution { public: int subarraySum(vector<int>& nums, int k) { int n=nums.size(); vector<int> s(n+1); for(int i=0;i<n;i++){ s[i+1]=s[i]+nums[i]; } unordered_map<int,int> cnt; int ans=0; for(int sj:s){ ans+=cnt.contains(sj-k)?cnt[sj-k]:0; cnt[sj]++; } return ans; } };