Post

算法(十)--前缀和

前缀和

如何定义前缀和呢?

alt text

所以有s[i+1] = s[i] + nums[i]

下标从i到j-1的非空连续数组的元素和等于k,说明s[j] - s[i] = k

和为k的子数组

将上面的式子转换一下,得到s[i] = s[j] - k;这表示元素和为k的子数组的个数。然后在遍历数组的过程中用哈希表记录前缀和出现的次数,每遍历一个元素,就查看是否存在前缀和为pre - k的,如果存在就在ans加上哈希表中pre - k的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
int subarraySum(vector<int>& nums, int k) {
    unordered_map<int, int> map;
    int ans = 0, pre = 0;
    map[0] = 1;
    for (auto num : nums) {
        pre += num;
        if (map.count(pre - k) == 1) {
            ans++;
        }
        map[pre]++;
    }
    return ans;
}
This post is licensed under CC BY 4.0 by the author.