
前缀和解法:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int count = 0;
for (int i = 0; i < nums.size(); i++) { //实现从任意的num[i]加到[j]
int sum = 0;
for (int j = i; j>=0; j--) {
sum += nums[j];
if (sum == k) count++; //在同一个循环里比较,不用存储前缀和占用额外空间,也不用从数组中读取节约了时间
}
}
return count;
}
};
另解:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int flag=0;
vector<int> sum;
sum.push_back(0);
for(int i=0;i<nums.size();i++) sum.push_back(sum[i]+nums[i]); //遍历第一项到第i项之和
for(int i=0;i<sum.size()-1;i++){
for(int j=i+1;j<sum.size();j++){
if(sum[j]-sum[i]==k) flag++; //遍历全部和并判断
}
}
return flag;
}
};
哈希表与unordered_map
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> numbers;
numbers[0] = 1;
int count = 0, pre = 0;
for (int i = 0; i < nums.size(); i ++) {
pre += nums[i];
if (numbers.find(pre - k) != numbers.end()) count += numbers[pre - k];
numbers[pre]++;
}
return count;
}
};
unordered_map可以看作读取更快的数组
number[x]的值为num[0]+到任意num的累加出现的次数,
由于

因此从左至i满足条件的子数组数等于pre[j-1]出现的次数,正好由number[x]记录了
一开始一直在纠结numbers的赋值忽略了for循环内的操作,以后得注意,不是什么都要预先处理好再进行下一步操作的
另思路:

1326

被折叠的 条评论
为什么被折叠?



