LeetCode刷题之——560. 和为K的子数组,前缀+哈希表方法,表格+图片直观理解

nums[]   3 4 7 2 -3 1 4 2
preSum[] 0 3 7 14 16 13 14 18 20
差值(k=7)   -4 0 7 9 6 7 11 13
计数     1 1     1   1

 说明:

原始暴力解的判断语句:

for (int i = 1; i <= n; i++)
    for (int j = 0; j < i; j++)
        if (preSum[i] - preSum[j] == k)
            count++;

哈希表解法的判断语句:

if (preSum[j] == preSum[i] - k)
    count++;

这里的等式变形对应表格中的第三行差值,算出这个差值后,我们再去找当前遍历位置之前(不含当前位置)有几个和这个差值一样的值(假设有 X个),并以此更新count的值。

哈希表如图所示,键值为preSum前缀和,实值为这个前缀和(到当前位置为止)在preSum中出现的次数,通过哈希表,我们能很方便地找到这个 X。

由于preSum 初始值为0,表示没有开始遍历数组时的前缀和为0,因此哈希表被初始化为{(0,1)}。

原文地址:https://www.cnblogs.com/mrlonely2018/p/14849653.html