问题
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
思路(今天也是崇拜官方的一天)
刚开始的思路是窗口,具体就是设定一个窗口,然后如果这个窗口内的数据大于k,那么就让窗口前面抛弃一个值,否则窗口扩充,但是后来当k=0的时候死活过不去,所以放弃!
官方的解答和微妙,就是正常人的思路,如果我想知道当前值之前有没有存在和为k的子数组,那么就用当前值减去k得到的pre,看pre这个值是是之前的前缀和
那么现在问题就是构建前缀和了,所以就采用一个map哈希作为记录
更多可以看官方解答:官方解答
代码(c++)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map <int,int> data;
data[0]=1;//初始化,当数据是从0开始加时,加1
int result=0;
int pre=0;
for(int i=0;i<nums.size();i++){
pre+=nums[i];
if(data.find(pre-k)!=data.end()) result+=data[pre-k];
data[pre]++;//如果存在data[pre]为2的情况,那就说明前面的值部分被正负抵消了
}
return result;
}
};