LeetCode 560. 和为K的子数组(前缀和+哈希+问题转化)
思路
-
把问题转化成 求任意两个前缀和A和前缀和B的差 = K
-
用哈希表unordered_map存:每一个前缀和的出现次数
-
比如说 前缀和A已经存在了哈希表中,且A出现过两次,那么现在走到前缀和B的位置,一旦B-K的值在哈希表里出现过,说明有这个子数组存在,且个数是哈希表对应的value值
额外测试数据
题目给的数据不是很好推过程
测试数据:3 4 5 2 -3 1 4 2 k=7 -> ans=4
注意k=0的数据
-
nums=1 k=0 -> 0
-
nums=-1,-1,1 k=0 ->1
AC代码
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int sum[20010];
memset(sum,0,sizeof(sum));
unordered_map<int,int>mp; // 底层哈希表 ,记录出现次数而不是是否出现过
int ans=0;
mp[0]=1; // *** 一定要加上!
for(int i=0;i<nums.size();i++) // i是索引
// for(auto &i:nums) // i是值,不是索引! 索引需要额外开一个变量index记录
{
if(i==0) // 初始化
sum[0]=nums[i];
else
sum[i]=sum[i-1]+nums[i];
if(mp[sum[i]-k]) ans+=mp[sum[i]-k];
mp[sum[i]]++; // 上一步判断完再标记!否则 1 k=0会输出1而不是正确答案0
}
return ans;
}
};