问题:
有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?
解答:
方法1:
设这些数保存在数组A中,用一个10w的数组B标志某一个数是否出现,i出现则B[i]=1,没出现则B[i]=0;扫描数组B,查找缺失的两个数。
时间复杂度:O(N)
空间复杂度:O(N)
方法2:
因为每个数只要两种状态,出现或者不出现,因此可以缩减方法1的空间复杂度,用BitMap代替数组。
时间复杂度:O(N)
空间复杂度:O(N),只是常系数小一些
方法3:
设确实的两个数为X和Y,则我们可以通过累加1到10W的和 减去 数组A的和,得到X+Y的值S1:
X+Y = S1
同理,我们可以得到1到10W的平方和 减去 数组A中每个数的平方和,从而得到X^2 + Y^2的值:
X^2 + Y^2 = S2
根据两个方程可以解出X和Y。
这里需要注意的是,计算平方和的时候有可能会越界,可以使用unsigned long long,或者一边加(1到10W的平方和)一边减(数组A中每个数)。