给定一个整数数组和一个整数 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