要求在不定序的数组中寻找元素和为K的连续的子数组。
思路
滑动窗口(FAIL)
滑动窗口可以解决一些用例,但是在数组递增or递减时并不奏效: 以判断条件为元素和是否大于等于K为计数条件时,遇上元素连续为负数;反之亦然。
前缀和
前缀和是累计前0~i元素的和,当sum[i] - sum[j] == k时,说明j~i之间的连续子数组的和为K。
边界情况
- 当仅有一个元素且为K时,无法找到对应0的sum值,因此需要初始化sum[0]为0。
- 当存在多个对应的sum值时,应设置计数累加为该sum值的个数(多个子数组符合情况)。
实现
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mapping;
mapping[0] = 1;
int count = 0;
int prefix_sum = 0;
int index = 0;
while (index < nums.size()) {
prefix_sum += nums[index];
if (mapping.find(prefix_sum - k) != mapping.end()) {
count += mapping[prefix_sum - k];
}
mapping[prefix_sum]++;
index++;
}
return count;
}
};