前缀和算法: 可以O(1)时间下得到子数组的和。
python
class Solution:
def subarraySum(self, nums: List[int], k: int):
n = len(nums)
preNum = [0] * (n+1)
needs = {0:1}
count = 0
for i in range(n):
preNum[i+1] = preNum[i] + nums[i]
for i in range(1, n+1):
target = preNum[i] - k
if target in needs.keys():
count += needs[target]
if preNum[i] not in needs.keys():
needs[preNum[i]] = 1
else:
needs[preNum[i]] += 1
return count
c++
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// 前缀和
int n = nums.size();
int res = 0;
vector<int> preSum(n+1, 0);
for (int i = 1; i <= n; i++) {
preSum[i] = preSum[i-1] + nums[i-1];
for (int j = 0; j < i; j++) {
if (preSum[i] - preSum[j] == k) res++;
}
}
return res;
}
};
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// 前缀和数组 + 哈希表记录出现目标值前缀和的次数
int n = nums.size();
int res = 0;
int sum = 0;
vector<int> preSum(n+1, 0);
unordered_map<int, int> count_map;
count_map.insert(make_pair(0, 1));
for (int i = 0; i < n; i++) {
sum += nums[i];
res += count_map[sum-k];
count_map[sum]++;
}
return res;
}
};