問題描述:
給定一個整數數組和一個整數 k,你需要找到該數組中和爲 k 的連續的子數組的個數。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k
示例 1 :
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 爲兩種不同的情況。
說明 :
數組的長度爲 [1, 20,000]。
數組中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。
解題思路:
建立map表用於存儲每個連續子數組sum求和出現的次數,初始化爲(0,1),表示和爲0的連續子數組出現1次。
sum的值是在對nums數組的循環中不斷累加當前元素的,res的值則需要查找map中是否已存在sum-k的元素,也就是在查找此前所有從0項開始累加的連續子項和中有沒有sum-k。
如果有的話,則說明從該項到當前項的連續子數組和必定爲k,那麼res則可以和這個sum的對應值,即這個sum出現的次數,相加得到新的res。
對於當前sum如果已存在與map中則其對應值+1,不存在則添加新項,初始值爲1。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
if(nums.size()==0){
return 0;
}
map<int,int> table;
table[0] = 1;
int res = 0;
int sum=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
res+=table[sum-k];
table[sum]++;
}
return res;
}
};