问题描述: 一直有限集U,U内元素各不相同,先从U中删去/添加元素 x1, x2, ... , xn (0<=n<=U.length, xi 属于 U)得到 U',找出所有删去/添加的元素, 要求时间复杂度为O(n),空间复杂度为O(1)
1.先讨论最简单的情况,我们只从集合U中删除/添加 1个元素
例如, U = {5, 3, 1, 4, 2} U' = {5, 3, 1, 2}
又如 U = {5, 3, 1, 4, 2} U' = {5, 3, 1, 4, 1, 2}
这种情况解法很简单,一般来讲如下:
1) 设sum(U)表示集合U所有元素之和,则删除的元素为 sum(U) - sum(U'), 添加的元素为 sum(U') - sum(U)
2) 根据异或的性质, A ^ A = 0, A ^ 0 = A, 设添加或删除的元素为x, 可知 U ^ U' = x
2. 假设是从集合U中删除/添加 2 个元素 a, b, 又如何
1) 假设sum(U)表示U所有元素之和,容易知道 sum(U) - sum(U') = +/- (a + b),由数学知识容易知道解2元方程需要两个方程,那么现在需要构造第二个方程。设product(U)表示U所有元素之积,那么 product(U) / product(U') = a*b 或 1/(a*b), 如果说这里product(U)有可能溢出,我们可以改用平方和。那么由这两个方程
sum(U) - sum(U') = +/- (a + b)
product(U) / product(U') = a * b 或 1 / (a * b)
即可解出所求的a, b
2) 使用异或,实际上此时 U ^ U' = a ^ b, 我们已经无法继续得到 a 或者 b的值
3. 假如删除/添加的元素有n个, a1, a2, ... , an ,又如何?
1) 可以继续使用解方程组的形式,当然你得找的到这么多方程组,还能解得出来
2) 想到原来双数组查找重复元素的方法, 可以先对 U 和 U‘ 进行排序,然后将元素多的数组在 短的数组里进行顺序查找,找到的元素从短数组里删去,找不到的元素即为重复或删去的元素,这个算法复杂度是排序算法的复杂度。