题目
思路
1.
将
所
有
子
数
组
遍
历
一
边
求
和
,
时
间
复
杂
度
为
O
(
n
2
)
将所有子数组遍历一边求和,时间复杂度为O(n^2)
将所有子数组遍历一边求和,时间复杂度为O(n2)
2.第二种思路,i遍历整个数组,求出从0到i,每个子数组的和为pre[i]。
定义nums[i] + pre[i - 1] = pre[i]
pre[i] - pre[j - 1] = k时,我们可以认为从j—>i的子数组之和为k
所以pre[j - 1] = pre[i] - k
求和为K的子数组的数量也就是求等于某个pre[i] - k 的 pre[j - 1]的子数组数量之和
有点绕,废话不多说,大家结合代码看吧
代码
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int ,int> hash;
hash[0] = 1;
int ret = 0, pre = 0;
for(auto& num:nums){
pre += num;
if(hash.find(pre - k)!=hash.end()) ret += hash[pre - k];
if(hash.find(pre)!=hash.end()) hash[pre]++;
else hash[pre] = 1;
}
return ret;
}
};