1.最简单的暴力算法,时间复杂度o(n^2),空间复杂度o(1)
class Solution
{
public:
int subarraySum(vector<int> &nums, int k)
{
int res = 0;
int sum = 0;
int size = nums.size();
for (int i = 0; i < size; ++i)
{
sum = 0;
for (int j = i; j >= 0; --j)
{
sum += nums[j];
if (sum == k)
++res;
}
}
return res;
}
};
2.优化时间复杂度,只能用空间换时间啦。用哈希表的键保存从0到j的连续子数组的和,值保存出现和的次数。假设i…j之间的和是解,那么就是
0..j - i..j = 0..i
所以每次以0…i之间的和为键在哈希表中查找
时间复杂度o(n),空间复杂度o(n)
class Solution
{
public:
int subarraySum(vector<int> &nums, int k)
{
int res = 0;
int sum = 0;
int size = nums.size();
unordered_map<int, int> mapping;
mapping[0] = 1;
for (int i = 0; i < size; ++i)
{
sum += nums[i];
if (mapping.find(sum - k) != mapping.end())
res += mapping[sum - k];
mapping[sum]++;
}
return res;
}
};