找出1到10w中没有出现的两个数字

问题:

有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中每个数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值