力扣第 560 题「和为 K 的子数组」前缀数组
超时
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int ans=0;
if(nums.size()<=0)
return ans;
vector<int> presum(nums.size()+1);
presum[0]=0;
for(int i=1;i<=nums.size();i++){
presum[i]=nums[i-1]+presum[i-1];
if(nums[i-1]==k) ans++;
}
for(int i=0;i<presum.size();i++)
for(int j=2+i;j<presum.size();j++)
{
if(presum[j]-presum[i]==k)
{
ans++;
// cout<<i<<j;
}
}
return ans;
}
};
np.transpose(seq_x) 转置
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size(),ans=0;
unordered_map<int, int> pre;
int sumj=0;
for(int i=0;i< n;i++){
sumj=sumj+nums[i];
int tar=sumj-k;
if(pre.find(sumj)==pre.end()){
pre[sumj]=1;
}
else{
pre[sumj]+=1;
}
if(pre.find(tar)!=pre.end()){
ans+=pre[tar];//pre.find(tar)->first;
}
}
if(pre.find(k)!=pre.end()){ans+=pre[k];}
return ans;
}
};
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
int sum = 0, res = 0;
mp[0] = 1;
for(auto num : nums){
sum += num;
res += mp[sum-k];
mp[sum]++;
}
return res;
}
};