您正在给出长度为N
的数组,并且数组中的数字包含1
到N
没有重复。您需要检查数组是否可以划分为相等和的列表。
我知道它可以使用时间复杂度为的子集和问题来解决。 是否有算法可以减少时间复杂度?
答案 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。