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)}。