`
yangyou230
  • 浏览: 1647697 次
文章分类
社区版块
存档分类

10亿个正整数,只有其中1个数重复出现过,要在O(n)的时间里面找出这个数,内存要尽可能少(小于100M)。

 
阅读更多

100M的内存=100*1024*1024*8bit=8,3886,0800 bit。我们做个取整,那么100M可以用的bit数将由8亿。
那么用每个bit来表示1个数,0表示没有出现,1表示出现,我们用取模的方式num%8亿来将数映射到8亿个bit中去,最前的2亿个bit会被重复映射,而剩下的6亿个bit只被映射一次;(step1,遍历一次)
由于10亿个正整数,只有其中1个数重复出现过,因此如果在映射到这后6亿个bit中,若发现某bit位已经是1,那么我们就提前找到这个数了;
否则我们可以认为重复的数是那些被映射到前2亿位的数。因此只要在第一遍映射中没有发现重复的数,则接下来我们只需要用4亿个bit来判断重复的数,即,前2亿个bit用来记录num/2亿=0的数,而后2亿个位用来记录num/2亿=4的数,这样同样若发现某bit位已经是1,那么我们就提前找到这个数了。(step2,遍历一次)。一共遍历了2遍,时间复杂度O(2n)=O(n)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics