将包含数字从1到n(无重复)的长度为n的数组划分为两个相等和的算法

时间:2017-02-09 12:14:44

标签: arrays algorithm

您正在给出长度为N的数组,并且数组中的数字包含1N没有重复。您需要检查数组是否可以划分为相等和的列表。

我知道它可以使用时间复杂度为的子集和问题来解决。 是否有算法可以减少时间复杂度?

2 个答案:

答案 0 :(得分:2)

根据您的要求,我们得出结论,数组将始终包含数字1到N. 所以if Array.Sum()==Even答案是肯定的,否则为否。

答案 1 :(得分:0)

由于从1到n的元素总和等于n*(n+1)/2,您必须检查n*(n+1)是否是4的倍数,这相当于检查n是否是4,或n+1是4的倍数。它的复杂性是O(1)。 如果满足此条件,则两个子集为:

如果n是4的倍数:一方面将前半部分的奇数与后半部分的偶数相加,另一方面将偶数的前半部分与后半部分的奇数相加。 例如,1 3 5 8 10 12和2 4 6 7 9 11。

如果n = 3模4:几乎相同的东西,只是一方面将前3分为1和2,另一方面分为3,你有剩余的系列,其大小为4。 例如:1 2 4 7和3 5 6;或者如果你愿意,3 4 7和1 2 5 6。