看了Solution给的四种解法:
1.暴力法,O(n3),它说超时
2.从第1个元素到第 i 个元素累加和用一个数组 s [ i ] 存起来。子数组和=sum[end] -sum[start]。然后两层循环试遍每种情况.
时间O(n2),空间O(n)
3.和2差不多,只不过不用数组了,边加边比较.时间O(n2),空间O(1)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int length = nums.size();
int sum;
int count = 0;
for(int start=0; start<length; start++) {
sum = 0;
for(int end = start; end<length; end++) {
sum += nums[end];
if(sum == k) {
count++;
}
}
}
return count;
}
};
4.哈希算法,也利用了2的思想。用STL的map或unordered_map记录每种和出现的次数。
<int,int>第一个int记录出现过的和,第二个是对应的次数。
新和-k如果能在hash表中找到,找到几次加几次,代码如下
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int length = nums.size();
int count = 0;
int sum = 0;
map<int, int> m{{0,1}};
for(int i=0; i<length; i++) {
sum += nums[i];
count += m[sum-k];
m[sum]++;
}
return count;
}
};
此题顺便学一下map用法,还是非常简洁的。