拍案叫绝的算法分析

拍案叫绝的算法分析

在知乎上有一个拍案叫绝的算法,它主要用来通过位运算查找非重复的对象。具体的内容请查看:

https://www.zhihu.com/question/27547892

这里主要对两个算法的分析说明,小白一下,可能有的同学们刚刚入门:

第一个,有一个N元素的数组,其它都出现了两次,只有一个出现了一次,找出这个数,要求:时间复杂度为O(n)且不再开辟新的内存空间。

[2,2,1]===>1

[4,1,2,1,2]===>4

看到了左面和右面两个分解没,把相关的数转化成二进制的形式,然后按位异或,这个大家肯定都会,比加法还简单,都不用处理进位。然后得到结果再转回到十进制,就是结果了。重点在第二个,有一个n个元素的数组,除了两个数只出现一次外,其余元素都出现两次,让你找出这两个只出现一次的数分别是几,要求时间复杂度为O(n)且再开辟的内存空间固定(与n无关)。

[1,2,2,1,3,4]===>[3,4]

还是看一下图:

第一步,和上面的单一求解一致。没有什么问题,第二步,如何找出两个不同的单次出现的值呢?网上的分析说得清楚,肯定至少有一位是不同的,但是是哪一位呢?在这里,可以假定第一位,那么就如网上的动态图一致,将已知的数据分成了两组。

看一下图上的重点部分:用三种颜色来标明了可以有三种选择的方式,即第一个为1(0),第二为1(0),第三个为1(0)。然后根据这个,把原来的数据分成了2部分*3组,每一组都可以正确得到结果。也就是说,不用把全部三组都算出来,只要有其中一组就可以了。

这里之所以列出三组来,是为了说明,用任何一组都可以得出正确的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值