原数组【。。。。】
sum数组【。。。。】(每一个值是从0到此处的和)
sum_target【。。。。】(sum数组每个数-目标)
一个map :int->int
过程:
遍历原数组:
得到sum数组,将sum数组出现过的次数都放入map,
sum数组不要了,直接减target得到sum_target
sum_target当前值去找map里面存没存过,因为现在找的就是小于等于当前位置的,所以只要排除正上方位置的就行
(我居然能写出这段。。。)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int cnt, len, sum, i;
len = nums.size();
sum = 0;
vector<int> vec;
map<int, int> mp;
mp[0] = 1;
cnt = 0;
// 获取(前缀和-目标)的数列vec
for (i=0; i<len; i++) {
sum += nums[i];
vec.push_back(sum); // 前缀和
if (mp.find(sum) != mp.end()) {
mp[sum]++;
} else {
mp[sum] = 1;
}
vec[i] -= k; // 前缀和-目标
//here
if (mp.find(vec[i]) != mp.end()) {
cnt += mp[vec[i]];
if (k == 0) { //
cnt--;
}
}
}
return cnt;
}
};