算法练习-使用前缀和方法解决`和为K的顺序子数组`

39 阅读1分钟

要求在不定序的数组中寻找元素和为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;
    }
};