給定一個整數數組和一個整數 k,你需要找到該數組中和爲 k 的連續的子數組的個數。
示例 1 :
輸入:nums = [1,1,1], k = 2 輸出: 2 , [1,1] 與 [1,1] 爲兩種不同的情況。
說明 :
- 數組的長度爲 [1, 20,000]。
- 數組中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map <int ,int> hash;//在這裏的思想爲: 我們假設一個區間
int result =0;
int s =0;
hash[0] =1;//這裏設置爲 1 的原因是,如果輸入爲 [3,-3], K=0;
// 那麼就需要我們設置 hash[0] =1; 這個初始值了
for(auto x:nums){
s +=x;
if(hash.find(s-k) != hash.end()){
result += hash[s-k];//把前面 hash[s-k] 的次數累加起來
}
hash[s] ++;
}
return result; //返回來結果
}
};
/*假如存在區間[left,right],使得在[left,right]這個區間的子數組的和爲k。換句話說,就是前right項和減去前left項和等於k,即前left項和等於前right項和減去k。
可以這樣做,在掃描數組的同時,假設當前掃到第i位,記錄它的前i項和sum,用該和減去k,即sum-k,判斷sum-k是否爲某個位置的前n項和,若是,更新統計量。
作者:jarvis1890
鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/qian-zhui-he-shi-xian-jian-dan-by-jarvis1890/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
*/
// 加油加油。Try to make yourself more excellent