使用握手引理查找偶数为

时间:2018-01-29 05:54:54

标签: java arrays algorithm

我试图做练习问题并遇到了一个解决方案,我不明白背后的原因。

这个问题可以在这里找到,找到偶数和子阵列的数量。 https://www.geeksforgeeks.org/find-number-subarrays-even-sum/

有人提出了相关问题,但我在解决方案结束时特别询问握手引理的使用。

我知道我们建立了偶数和奇数和子阵列的计数,但是不知道为什么我们使用手抖动引理来计算偶数和子阵列的数量。如果我们得到偶数和奇数累积和的计数,那么握手引理如何完全适用于此?很明显,偶数和子数组由奇数+奇数,偶数+偶数或单独的偶数值组成,所以我想知道在这个特定情况下究竟是如何计算所有情况的。谢谢你的帮助!

1 个答案:

答案 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