思路
-
把問題轉化成 求任意兩個字首和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;
}
};