我试图做练习问题并遇到了一个解决方案,我不明白背后的原因。
这个问题可以在这里找到,找到偶数和子阵列的数量。 https://www.geeksforgeeks.org/find-number-subarrays-even-sum/
有人提出了相关问题,但我在解决方案结束时特别询问握手引理的使用。
我知道我们建立了偶数和奇数和子阵列的计数,但是不知道为什么我们使用手抖动引理来计算偶数和子阵列的数量。如果我们得到偶数和奇数累积和的计数,那么握手引理如何完全适用于此?很明显,偶数和子数组由奇数+奇数,偶数+偶数或单独的偶数值组成,所以我想知道在这个特定情况下究竟是如何计算所有情况的。谢谢你的帮助!
答案 0 :(得分:1)
首先我们有一组数字,例如:
[1,3,5,2,10,7]
那么,如何用偶数计算子阵列的数量?
让我们将它转换为另一个名为sum
的数组,其中索引ith
的值是从0到第i个索引的子数组的总和
[1,4,9,11,21,28]
显然,我们可以看到,对于范围a to b
的子数组,即使且仅当sum[b] - sum[a - 1]
是偶数时,此子数组的总和才是。
现在,让我们想象一下连接sum
中偶数和奇数条目以及甚至sum
中的奇数和奇数条目的图表 - >此图中的边数是这个问题的答案。
因此,从握手引理中,2 * E =所有顶点度之和
每个奇数顶点的度数为number of odd vertex - 1
每个偶数顶点的度数为number of even vertex - 1
=>所以
2*E = odd*(odd - 1) + even*(even - 1) => E = odd*(odd - 1)/ 2 + even*(even - 1)/2
理解这一点的另一种方法是odd
条目,选择odd - odd
对的方式数量为C(odd, 2) = odd*(odd - 1)/2
,其中C为combination